web-dev-qa-db-ja.com

1つのモジュールを別のモジュールアーティファクトに依存させる方法は?

Mavenの複数モジュールプロジェクトがあります。

 A: parent.
    B: child1.
    C: child2.

Bはjarファイルを取得するためにパッケージ化され、cはこのjarファイルを使用してコードをコンパイルします。

Bでmvn packageを実行すると、b.jarが作成されます(別の目的でB/target/jarsではなくB/targetに残ります)。

Cでは、そのb.jarを使用してコードをコンパイルする必要があります。

さて、Aから実行すると、mvn packageになります。最初に、Bのb.jarファイルの作成に成功しました。

しかし、Cのコンパイルフェーズになると、Cはクラスパス内のb.jarを認識しないようです(CのコードはBからクラスファイルをインポートできないため、コンパイルでエラーが発生します)。

私の質問は次のとおりです。どうすればこの問題を解決できますか?

---------- Belowはpomファイルです

A: pom.xml
  <groupId>AAA</groupId>
  <artifactId>A</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

   <modules>
   <module>C</module>
   <module>B</module>
   </modules>

B: pom.xml
        <groupId>AAA</groupId>
 <artifactId>B</artifactId>
 <packaging>jar</packaging>
 <version>0.0.1-SNAPSHOT</version>
 <parent>
  <artifactId>A</artifactId>
  <groupId>AAA</groupId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

C: pom.xml
       <parent>
  <artifactId>A</artifactId>
  <groupId>AAA</groupId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

 <groupId>AAA</groupId>
 <artifactId>C</artifactId>
 <packaging>war</packaging>
 <version>0.0.1-SNAPSHOT</version>

 <dependencies>

  <dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>0.0.1-SNAPSHOT</version>
  </dependency>
....
39
David

私にはうまくいくはずです。ただし、mvn install の代わりに mvn package

23
Matt McHenry

$ {project.version}をお試しください

例えば.

<dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>${project.version}</version>
  </dependency>
15
Justin Patel

私の質問は、この問題をどのように解決できるかです。

依存関係の解決はローカルリポジトリを通じて行われるため、問題を「解決」する標準的な方法は、Aからinstallを実行して、モジュールがローカルリポジトリにインストールされるようにすることです。

さて、次のコメントに関して

ただし、インストールを実行すると、c warファイルもインストールされます。それは私の現在のプロジェクトでは受け入れられません」。

確かに、私はあなたのプロジェクトには参加していません。すべての制約とルールがわかりません。しかし、Mavenを使用することに決めた場合、これはまったくばかげたポリシー(真剣に、WTFですか?)であり、systemスコープの依存関係を使用することは確かに良い解決策ではありません(後のトラブルが保証されます)。このポリシーが本物である場合、その場合はMavenを使用しないことをお勧めします。

10
Pascal Thivent

私は解決策を持っている:スコープ=システムとの依存関係を使用して

cのpom.xmlで

           <dependency>
            <groupId>AAA</groupId>
            <artifactId>B</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${basedir}\..\B\target\jars\b.jar</systemPath>
        </dependency>

そして、のpom.xmlに、このような上にモジュールBを入れて

<modules>
       <module>B</module>       
       <module>C</module>
 </modules>
2
David

Mvn installを実行すると、コマンドを実行しているマシンのローカル.m2リポジトリにのみアーティファクトが配置されます。どうしてそれが受け入れられないのでしょうか?パスカルに同意します。 Aを構築する場合、そこに戦争が行われる理由はないはずです。

一方、Maven 2.2.xを使用している場合は、 maven reactor plugin ?をご覧ください。これは、受け入れられないクレイジーな人がC.warを現在のプロジェクトのローカル.m2リポジトリポリシーにインストールできないようにするのに役立つはずです。

1
jgifford25