最初に、マルチモジュール (アグリゲーター) ビルド (つまり、アグリゲーター/親プロジェクトからビルドを呼び出すこと) と単一モジュールのビルドについて明確にしましょう。
次の例を使用してみましょう。
-+ modules-project
|- module-a
|- module-b (depends on module-a)
したがって、modules-project には pom の一部として次のものが含まれます。
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
module-project フォルダーからビルドする場合:
module-project> mvn clean install
Maven Reactorは、宣言されたモジュールの依存関係グラフを作成し、それに応じてビルドします。したがって、module-b は module-a に依存するため、module-a は module-b の前にビルドされます。
module-b> mvn clean install
module-b のみをビルドし、module-a を依存関係 (以前にインストールしたもの) として解決し、必要に応じてそれをビルド クラスパスの一部として使用すると、正しく動作します。
clean install
modules-project でa を呼び出す代わりに a を呼び出した場合clean package
、Maven はローカル Maven キャッシュに何もインストールしていないため、module-b プロジェクトの module-a への依存関係を解決できませんでした。明確にするために:
module-project> mvn clean package
プロジェクト全体 (すべてのサブモジュールを含む) を引き続きビルドし、パッケージ (つまり、jar ファイル) を作成します。
module-b> mvn clean package
module-a への依存関係がローカル Maven キャッシュにも Maven リポジトリにも存在しないため、現在は失敗します。つまり、依存関係として存在せず、Maven は他のモジュールについて何も知らないため、ビルド中です。他のモジュールに関する知識のない単純なプロジェクト (モジュール) (modules-project によって提供される)。代わりに modules-project をビルドする場合、Maven は、モジュールが別のモジュールに依存していることを認識して、より多くの情報を使用して各モジュールをビルドします。モジュール間の依存関係については、ローカル キャッシュや Maven リポジトリを参照しません。繰り返しますが、リアクター ビルドです。
そのため、サブモジュールを別のビルドとしてビルドできるのは、マルチモジュール プロジェクト全体を既にビルドし、そのアーティファクトを少なくともローカルの Maven キャッシュにインストールしている場合のみです。そのため、ベスト プラクティスは常にマルチモジュール プロジェクトから作業することです。これにより、Maven に必要なすべての情報が含まれ、次のことが可能になります。
- マルチモジュール プロジェクト全体をビルドする (
mvn clean install
)
- オプションを使用して単一または一連のモジュールをビルドし
-pl
ます (ただし、マルチモジュール プロジェクトから開始します)。
- およびオプションを使用して、単一またはセットのモジュールとその依存関係を構築します (マルチモジュール プロジェクトから)
-pl
-am
あなたの質問にも答える最後のポイントを明確にしましょう。
modules-project> mvn clean package -pl module-a
正常に動作し、リアクター ビルドの一部として module-a のみをビルドします。でも
modules-project> mvn clean package -pl module-b
Maven は要求に応じて module-b のビルドを試みますが、モジュールではなく依存関係として module-a を検索するため、失敗します。そのため、ローカルの Maven キャッシュまたは構成済みの Maven リポジトリで、それが見つかりません。
modules-project> mvn clean package -pl module-b -am
現在、Maven は依存モジュールも構築しており ( のおかげで-am
)、それらを見つける場所を正確に知っているため (マルチモジュール情報の一部、つまりmodules
セクション)、最終的には正常に動作します。
最後のケースを見てみましょう:
module-b> mvn clean package -am
マルチモジュール プロジェクト全体をインストールしなかった場合 (つまり、常に を実行した場合)は失敗します。オプションは、リアクター ビルドの一部でない場合は無視され (通常のビルドではなく、リアクターのオプションであるため)、Maven はそれでも、ローカル キャッシュまたはリポジトリで module-a を見つけようとします。clean package
-am
-pl
そのため、次のことを確認するために、常にアグリゲーター/親からおよび-am
オプションを介してサブモジュールを構築する必要があります。
- 適切な依存関係とモジュール情報を使用して、正しくビルドする
- モジュールのコードと整合していない可能性のある Maven キャッシュに以前にインストールしたものに対してではなく、コード/依存関係の最新バージョンに対してビルドします
それがあなたの観察が正しい理由でもあります。あなたが言及した最初の呼び出し(アグリゲータープロジェクトからサブモジュールを構築する)は、単にサブモジュールを構築するだけでなく、それ以上のものであるため(処理する情報が多く、それが異なるタイプのビルド、リアクター 1、依存モジュールをビルドする可能性もある)、サブモジュールを (そのディレクトリから) 直接ビルドすることは、より単純な Maven ビルドであり、そのため高速でもあります (ただし、一部の情報が不足しているため、エラーが発生しやすくなります)。
リアクター ビルドのこれらのオプションの詳細については、次の URL を参照してください。