20

1日に2回質問するのはマウベイトンだと知っていますが、もう1つのMavenパズルゲームがあります。

5つのモジュール(5つのサブプロジェクト)を定義する親POMがあります。各モジュールはまったく同じ方法で実行されるため、<profile><build>セクションを親POMにプルして、重複するコードを取り除きます。さて、各モジュールから個別にビルドを実行すると機能しますが、すべてのモジュールを一度にビルドして親ディレクトリに移動すると、Mavenが最初に実行しようとするのは親プロジェクト自体であるため、エラーが発生します。

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

その後、execプラグインがそこにないものを実行しようとするため、ビルドは失敗します。出力を見ると、reactorプラグインがビルドを駆動していることは明らかですが、親をスキップするようにreactorを構成するにはどうすればよいですか?

samePS混乱を防ぐために-ビルド中に親でのプロファイルの実行を抑制し、子で有効にしようとしています

4

5 に答える 5

17

親ビルドをスキップすることはできませんが、ちょっとしたハックでプロファイルをアクティブにしないように構成できます。この回答<activation>は、ファイルベースの要素の有無によってプロファイルのアクティブ化を制御する方法を示しています。このようにして、親でプロファイルを定義できますが、マーカー ファイルが親に存在するため、そのプロジェクトでプロファイルを無効にします。子プロジェクトのソースにはマーカー ファイルがないため、それらのプロジェクトに対してプロファイルがアクティブになります。

明確にするために更新: 私のテスト プロジェクトでは、この構成は、親プロジェクト (src/main/resources にファイルがある) でプロファイルが非アクティブ化されているが、リソース ディレクトリにファイルがないすべての子プロジェクトでアクティブ化されていることを意味します。

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>
于 2009-10-01T07:03:47.710 に答える
11

親を構築することで何が問題になっていますか?

実際、Maven には 2 つの異なる概念があります (通常は同時に使用されます)。

  • 親POM
  • モジュールの集約

最初のものは、すべての子供に共通するすべての定義です。親を pom パッケージ化されたプロジェクトとして定義し、それをリポジトリにインストールできます。

この親の子を作成すると、Maven2 はこの親を取得して、親 pom を子 pom とマージします。コマンドを実行すると、pom.xml 全体を確認できますmvn help:effective-pom

この場合、親 pom はビルドされず、リポジトリから取得されるだけです。

modules2 番目のケースは、サブプロジェクトのリストを含むプロジェクトです。原則として、このプロジェクトで実行するすべてのコマンドは、すべてのサブモジュールでも実行されます。モジュールの順序は、Reactor によって定義されます。Reactor は、モジュール間の依存関係を調べて、他のモジュールよりも先にビルドする必要があるモジュールを見つけます。依存関係がない場合は、親の pom.xml で定義されているモジュールのリストを取得します。

この場合、ルート プロジェクトでコマンドを実行すると、Maven2 は最初にルート プロジェクトをビルドし、次にサブモジュールをビルドします。ルート プロジェクトの作成をスキップすることはできません。


編集、RichSeller コメントのおかげで

マルチモジュール (集約プロジェクト) と継承 (親プロジェクト) の違いの完全な説明は、こちらの Maven ブックにあります。

于 2009-10-01T07:21:52.273 に答える
4

私の状況には部分的な妥協があることを文書化したい (Maven ユーザーメーリングリストの提案者に感謝)。基本的に、プロファイルを 2 つに分割する必要があります。プラグインの再利用可能なconfigurationセクションは親 POM に移動executionsし、子 POM にとどまります。次に、子のプロファイルプラグインがとしてマークされinherited、出来上がり-実行時に、executionsセクションが欠落しているため、親プロファイルは実行されません。これは理想とはほど遠いですが、うまくいきます。たとえば、このリンクを参照してください

于 2009-10-02T04:56:11.863 に答える
3

上記の Rick Seller によって提供された「不足している」ファイル ソリューションを実装できませんでした。モジュールにマーカーファイルがなくても、プロファイルのアクティブ/非アクティブ状態を設定すると変更されないようです。しかし、ここに私の問題に対する正確な解決策があります。警告: これは Maven 2.1+ 以降でのみ利用可能です

foo と boo という 2 つのモジュールが定義された親 POM がある場合、通常の状況では実行順序は次のようになります。

  1. ふー
  2. ブー

親ビルドをスキップするために必要なことは、このコマンド ライン スイッチを追加することだけです

mvn install –rf foo

--resume-fromまたは、親をスキップして foo モジュールから続行することを使用できます。現在-Reactorプラグインを構成することでこれを実現できるかどうかを調査しています(PS-できません)が、スイッチを使用しても、上記のシナリオはうまく機能します

于 2009-10-06T17:28:39.717 に答える
1

これは、同じ質問 Maven に対する @romaintaz の回答によって暗示されています- 親プロジェクトのビルドをスキップします

ただし、これを明確にするために、親の pom では、パッケージング要素を pom (jar や war ではなく) として指定することが不可欠です。
例:

<packaging>pom</packaging>
于 2011-07-25T11:32:12.280 に答える