web-dev-qa-db-ja.com

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

私は、親プロジェクトPと3つのサブモジュールAB、およびCを持つマルチモジュールMavenプロジェクトを持っています。 BCはどちらも戦争プロジェクトで、どちらもAに依存しています。

Pmvn compileを入力して、すべてのサブモジュールを正しくコンパイルすることができます。特定のモジュールに対して操作をしたいときに問題が生じます。

プロジェクトBに対する戦争をパッケージ化できるようにしたいのですが、Bのディレクトリからpackageコマンドを実行すると、Aに対する依存関係を見つけることができないという不平があります。

Mavenと依存モジュール おそらくMavenはこの種の依存関係解決のためには設計されていませんが、どうすればBをパッケージ化するのかという疑問を投げかけるでしょうか。

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

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

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

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

306
Brian Ferris

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

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

582
Pascal Thivent

Mavenは絶対にこの種の依存関係のために設計されました。

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

親プロジェクトでmvn installを実行すると(A)、これですべてのサブモジュールがあなたのコンピュータのMavenレポジトリにインストールされます。サブモジュールをコンパイル/パッケージするだけで変更がなければ(Ma)パッケージ化されインストールされた依存関係はちょうどいいです。

コードの一部を更新した場合は、親プロジェクトにmvn installを追加するだけです。

8
victor hugo

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

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

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

7
Rich Seller

親pom.xmlに6つのモジュールが含まれており、ABおよび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はリアクター内のすべてのプロジェクトを調べて、特定のプロジェクトに依存するプロジェクトを見つけます。これらのプロジェクトは自動的にビルドされ、それ以外は何も行われません。

5
Waqas Ahmed

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

Maven Reactorプラグイン はプロジェクトの一部を構築するためのものです。

特定の目標はreactor:makeです。

5
deterb

あなたは「本当にBが欲しい」と言っていますが、これは誤りです。あなたはBが欲しいのですが、それに何らかの変更があったならば更新されたAも欲しいです( "アクティブ開発")。

そのため、A、B、Cで作業したいことがあります。この場合、アグリゲータープロジェクトPがあります。AとBで作業したい場合(ただし、はそうではありませんC)が欲しいのですが、アグリゲータプロジェクトQを作成するべきです。

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

3
Zac Thompson