私は、親プロジェクトP
と3つのサブモジュールA
、B
、およびC
を持つマルチモジュールMavenプロジェクトを持っています。 B
とC
はどちらも戦争プロジェクトで、どちらもA
に依存しています。
P
にmvn compile
を入力して、すべてのサブモジュールを正しくコンパイルすることができます。特定のモジュールに対して操作をしたいときに問題が生じます。
プロジェクトB
に対する戦争をパッケージ化できるようにしたいのですが、B
のディレクトリからpackageコマンドを実行すると、A
に対する依存関係を見つけることができないという不平があります。
Mavenと依存モジュール おそらくMavenはこの種の依存関係解決のためには設計されていませんが、どうすればB
をパッケージ化するのかという疑問を投げかけるでしょうか。
本当にB
がほしいときに、プロジェクト階層全体に対してmvn package
を実行する必要がありますか。
B
をパッケージ化するたびにAのスナップショットをローカルリポジトリにインストールする必要がありますか?
A
がまだ活発に開発されている場合、この2番目のシナリオはあまり面白くありません。
ここでベストプラクティスはありますか?
ここでベストプラクティスはありますか?
Maven 高度な原子炉オプション を使ってください。
-pl, --projects
Build specified reactor projects instead of all projects
-am, --also-make
If project list is specified, also build projects required by the list
そのため、親のPディレクトリにcd
を入力して実行します。
mvn install -pl B -am
そしてこれはBとBが必要とするモジュールを構築します。
ディレクトリ名とは異なるartifactId
を参照している場合は、コロンを使用する必要があります。
mvn install -pl :B -am
ここに記述されているように--- https://stackoverflow.com/a/26439938/480894
Mavenは絶対にこの種の依存関係のために設計されました。
mvn package
はローカルリポジトリには何もインストールしません。プロジェクトをパッケージ化してターゲットフォルダに残します。
親プロジェクトでmvn install
を実行すると(A)、これですべてのサブモジュールがあなたのコンピュータのMavenレポジトリにインストールされます。サブモジュールをコンパイル/パッケージするだけで変更がなければ(Ma)パッケージ化されインストールされた依存関係はちょうどいいです。
コードの一部を更新した場合は、親プロジェクトにmvn install
を追加するだけです。
プロジェクトBで以前にmvn installを実行したことがある場合は、ローカルリポジトリにインストールされているので、パッケージAをビルドするときにMavenが依存関係を解決できます。そのため、変更するたびにプロジェクトBをインストールする限り、プロジェクトAのビルドは最新のものになります。
アグリゲーターpomを使ってマルチモジュールプロジェクトを定義して、一連のプロジェクトを構築できます。
また、 m2Eclipse に言及する価値があります。これはMavenをEclipseに統合し、(オプションで)ワークスペースから依存関係を解決することを可能にします。したがって、複数のプロジェクトをハッキングする場合は、ワークスペースの内容がコンパイルに使用されます。変更に満足したら、mvn installを(各プロジェクトで順番に、またはアグリゲーターを使用して)実行し、それらをローカルリポジトリに保存します。
親pom.xmlに6つのモジュールが含まれており、A、BおよびFを実行するとします。
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>D</module>
<module>E</module>
<module>F</module>
</modules>
1-親プロジェクトにcd
mvn --projects A,B,F --also-make clean install
OR
mvn -pl A,B,F -am clean install
OR
mvn -pl A,B,F -AMD clean install
注:-amオプションでプロジェクトを指定すると、Mavenは指定されたプロジェクトが依存するすべてのプロジェクトを(直接または間接的に)ビルドします。 Mavenはプロジェクトのリストを調べ、依存関係ツリーをたどって、ビルドする必要があるすべてのプロジェクトを見つけます。
-amコマンドは、マルチモジュールビルドの特定のプロジェクトに必要なすべてのプロジェクトを作成しますが、-AMDまたは-also-make- dependentsオプションは、プロジェクトおよびそのプロジェクトに依存するプロジェクトをビルドするようにMavenを構成します。 -also-make-dependentsを使用すると、Mavenはリアクター内のすべてのプロジェクトを調べて、特定のプロジェクトに依存するプロジェクトを見つけます。これらのプロジェクトは自動的にビルドされ、それ以外は何も行われません。
あなたは「本当にBが欲しい」と言っていますが、これは誤りです。あなたはBが欲しいのですが、それに何らかの変更があったならば更新されたAも欲しいです( "アクティブ開発")。
そのため、A、B、Cで作業したいことがあります。この場合、アグリゲータープロジェクトPがあります。AとBで作業したい場合(ただし、はそうではありませんC)が欲しいのですが、アグリゲータプロジェクトQを作成するべきです。
2016年の編集:上記の情報は2009年に関連している可能性があります。2016年現在、ほとんどの場合これを無視し、単に-am
または-pl
を使用することを強くお勧めします。受け入れられた答えで説明されているようなコマンドラインフラグ。 v2.1より前のバージョンのmavenを使用している場合は、まずそれを変更してください:)