Mavenモジュール+単一の特定のモジュールの構築


384

私は、親プロジェクトのマルチモジュールMavenプロジェクト持ちPと三つのサブモジュールをABCBCはどちらも戦争プロジェクトであり、どちらもに依存していAます。

入力mvn compileしてP、すべてのサブモジュールを適切にコンパイルできます。問題は、特定のモジュールに対して操作を実行するときに発生します。

プロジェクトのwarをパッケージ化できるようにしたいのですBが、Bのディレクトリからパッケージコマンドを実行すると、の依存関係が見つからないというメッセージが表示されAます。

私はこの質問から理解します:Mavenと依存モジュールはおそらくMavenがこのタイプの依存関係解決のために実際に設計されていないが、それはどのようにパッケージ化するBかという疑問を引き起こします。

  1. mvn package本当に必要なときに、プロジェクト階層全体を実行する必要がありBますか?

  2. パッケージ化するたびに、ローカルリポジトリにAのスナップショットをインストールする必要がありますBか?

この2番目のシナリオは、Aまだ開発が活発に行われている場合はそれほど面白くありません。

ここでのベストプラクティスはありますか?


回答:


695

ここでのベストプラクティスはありますか?

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

したがってcd、親Pディレクトリーに移動して実行します。

mvn install -pl B -am

これにより、BとBが必要とするモジュールがビルドされます。

artifactIdディレクトリ名とは異なるを参照している場合は、コロンを使用する必要があることに注意してください。

mvn install -pl :B -am

ここで説明するように:https : //stackoverflow.com/a/26439938/480894


15
2011年にこのページにアクセスした人にとっては、これがより良い答えです。maven自体(Maven 2.1以降)内のマルチモジュールのサポートが改善されました。reactorプラグインを使用する必要はありません。
Spedge

17
別の非常に便利なオプションは、「-amd、-also-make-dependents」です。これは、reactorリスト内のプロジェクトに依存するすべてのモジュールをビルドします。
2011年

1
孫モジュールの構築についてはどうですか?
Bax

12
@Bax、mvn install -pl .,parent/child,parent/child/grandchild 複数のプロジェクトを区切るにはコンマを使用します。親ポンポンのために
ネオ

1
clean packageこの方法でモジュールを試すと、まだインストールされていないリアクタの依存関係を解決できません。それで-am不必要に部署を再構築します。
盆地

18

たとえば、pom.xmlに6つのモジュールが含まれていて、ABFを実行するとします。

<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

または

mvn -pl A,B,F -am clean install

または

mvn -pl A,B,F -amd clean install

注:-amでプロジェクトを指定すると、オプションを使用、Mavenは指定されたプロジェクトが依存するすべてのプロジェクトを(直接的または間接的に)ビルドします。Mavenはプロジェクトのリストを調べ、依存関係ツリーをたどり、ビルドする必要のあるすべてのプロジェクトを見つけます。

一方で-amコマンドは、マルチモジュールのビルドには特定のプロジェクトで必要とされるすべてのプロジェクトを作る、-amdまたは--also-メイク扶養家族のオプションは、プロジェクトとそのプロジェクトに依存して任意のプロジェクトをビルドするためにMavenを設定します。--also-make-dependentsを使用する場合、Mavenは、reactor内のすべてのプロジェクトを調べて、特定のプロジェクトに依存するプロジェクトを見つけます。これらのプロジェクトは自動的にビルドされ、それ以外は何も行われません。


8

Mavenは、このタイプの依存関係のために設計されています。

mvn package ローカルリポジトリには何もインストールせず、プロジェクトをパッケージ化してターゲットフォルダに残します。

いますmvn install。このすべてのサブモジュールは、コンピュータのMavenのリポジトリにインストールされると、親プロジェクト(A)にあなただけのコンパイル/サブモジュールをパッケージ化(B)とMavenはすでにパッケージ化取る必要がある変更はありません場合インストールされた依存関係は適切です。

mvn installコードの一部を更新した場合は、親プロジェクトでa を実行する必要があるだけです。


3
これは、開発中の悪夢です。イメージをサブモジュールで修正したら、インストールしてサーブレットコンテナーを起動することになります。人生は短い:(
hguser '25 / 11/15

7

以前にプロジェクトBでmvn installを実行したことがある場合は、ローカルリポジトリにインストールされているため、パッケージAをビルドすると、Mavenが依存関係を解決できます。したがって、変更するたびにプロジェクトBをインストールする限り、プロジェクトAのビルドは最新になります。

アグリゲーターpomを使用してマルチモジュールプロジェクトを定義し、一連のプロジェクトを構築できます。

また、m2eclipseについて言及する価値があります。これは、MavenをEclipseに統合し、ワークスペースからの依存関係を(オプションで)解決できるようにします。したがって、複数のプロジェクトをハッキングしている場合、ワークスペースのコンテンツがコンパイルに使用されます。変更に満足したら、mvn installを(各プロジェクトで順番に、またはアグリゲーターを使用して)実行し、ローカルリポジトリに配置します。


1
ターゲットプロジェクトのすべての依存プロジェクトがインストールされていることを保証する簡単な方法はありますか?私が持っている階層は実際にはここで説明されているものよりもはるかに複雑です。したがって、最後にコードを変更したのでトリッキーになる可能性があるため、各依存プロジェクトに対してmvn installを実行したかどうか覚えてください。
ブライアンフェリス

はい、モジュールを使用して一連のプロジェクトをビルドします。元の回答に追加されたリンクを参照してください。
リッチセラー、

5

私の回答Mavenと依存モジュールを見てください。

Mavenの原子炉のプラグインは、プロジェクトの一部を構築するに対処するために設計されています。

使用したい特定の目標reactor:make


3
これは正解でしたが、Maven 2.1ではreactorプラグインを使用する必要がなくなりました。「高度な原子炉オプション」に関連するこのスレッドでPascalの答えを見てください
Spedge

3

あなたは「本当にただBが欲しい」と言いますが、これは誤りです。Bが必要ですが、変更があった場合(「アクティブ開発」)には、更新されたAも必要です。

したがって、A、B、およびCを使用したい場合があります。この場合、アグリゲータープロジェクトPがあります。AおよびBを使用したい(ただし、C は使用しない)場合は、アグリゲータープロジェクトQを作成する必要があります。 。

2016年の編集:上記の情報は2009年に関連性があった可能性があります。2016年の時点では、ほとんどの場合これを無視し、受け入れられた回答で説明されているように単に-amor -plコマンドラインフラグを使用することを強くお勧めします。v2.1より前のバージョンのmavenを使用している場合は、最初にそれを変更してください:)


Grmphh ...その後、プロジェクトと同じ数のアグリゲータープロジェクトができます。
クリス2016

@クリス私はもうこれをお勧めしません。誰かがまだ方法を知りたい場合に備えて、ここに残しますが、私は常に-amフラグと-plフラグを使用します。回答を更新しました。
Zac Thompson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.