15

間に違いはありますか

C:/dev/path/to/Project> mvn package -pl MyModule -am -s settings.xml

C:/dev/path/to/Project/MyModule> mvn package -am -s ../settings.xml

私に関する限り、これら 2 つのアクションの結果は同じになるはずです。

ただし、動作はそれぞれのケースで異なるようです。前者の方が広範囲に見えます。後者はより早く終了します - そして私はそれがなぜなのかを理解しようとしています.

4

1 に答える 1

42

最初に、マルチモジュール (アグリゲーター) ビルド (つまり、アグリゲーター/親プロジェクトからビルドを呼び出すこと) と単一モジュールのビルドについて明確にしましょう。

次の例を使用してみましょう。

-+ 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 installmodules-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 を参照してください。

于 2016-03-02T22:05:00.113 に答える