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>
....
私にはうまくいくはずです。ただし、mvn install
の代わりに mvn package
。
$ {project.version}をお試しください
例えば.
<dependency>
<groupId>AAA</groupId>
<artifactId>B</artifactId>
<version>${project.version}</version>
</dependency>
私の質問は、この問題をどのように解決できるかです。
依存関係の解決はローカルリポジトリを通じて行われるため、問題を「解決」する標準的な方法は、Aからinstall
を実行して、モジュールがローカルリポジトリにインストールされるようにすることです。
さて、次のコメントに関して
ただし、インストールを実行すると、c warファイルもインストールされます。それは私の現在のプロジェクトでは受け入れられません」。
確かに、私はあなたのプロジェクトには参加していません。すべての制約とルールがわかりません。しかし、Mavenを使用することに決めた場合、これはまったくばかげたポリシー(真剣に、WTFですか?)であり、system
スコープの依存関係を使用することは確かに良い解決策ではありません(後のトラブルが保証されます)。このポリシーが本物である場合、その場合はMavenを使用しないことをお勧めします。
私は解決策を持っている:スコープ=システムとの依存関係を使用して
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>
Mvn installを実行すると、コマンドを実行しているマシンのローカル.m2リポジトリにのみアーティファクトが配置されます。どうしてそれが受け入れられないのでしょうか?パスカルに同意します。 Aを構築する場合、そこに戦争が行われる理由はないはずです。
一方、Maven 2.2.xを使用している場合は、 maven reactor plugin ?をご覧ください。これは、受け入れられないクレイジーな人がC.warを現在のプロジェクトのローカル.m2リポジトリポリシーにインストールできないようにするのに役立つはずです。