ディレクトリが存在する場合でも、そのタグの下のパスが既存のパスに解決されないため、プロファイルP2
はアクティブ化されません。プロパティをのように書き換えると、プロファイルがアクティブになります。exists
${project.basedir}/src/main/whatever
${project.basedir}
${basedir}
P2
${project.basedir}
これは、 がプロジェクトのベース ディレクトリに解決されないことを意味します。ただし、そうであるhelp:effective-pom
ことを示しています。これを報告しました ( MNG-5516 )。
また、P2があればP1も活動しないと思います。
それは正しいです。のドキュメントをactiveByDefault
引用する:
このプロファイル (この例では P1) は、同じ POM 内の別のプロファイルが前述の方法のいずれかを使用してアクティブ化されない限り、すべてのビルドに対して自動的にアクティブになります。デフォルトでアクティブになっているすべてのプロファイルは、POM のプロファイルがコマンド ラインまたはそのアクティブ化構成でアクティブ化されると、自動的に非アクティブ化されます。
「プロファイルの継承」はプロジェクトの集約では機能しますが、プロジェクトの継承では機能しないため、継承という言葉に混乱しました。
わかりやすくするために、この状況をシミュレートしました。空の pom は、標準のモデル、グループ、アーティファクト、およびバージョン タグを除いて空であることを意味します。
シンプルなシナリオ
ディレクトリ構造:
simple
\-pom.xml
ポン付け内容:
<profiles>
<profile>
<id>P1</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>P2</id>
<activation>
<file>
<exists>${basedir}/dir/</exists>
</file>
</activation>
</profile>
</profiles>
dir
ディレクトリmvn help:all-profiles
出力がない場合:
Profile Id: P1 (Active: true , Source: pom)
Profile Id: P2 (Active: false , Source: pom)
dir
ディレクトリmvn help:all-profiles
出力がある場合:
Profile Id: P2 (Active: true , Source: pom)
Profile Id: P1 (Active: false , Source: pom)
プロジェクトの継承
ディレクトリ構造:
inheritance
|--child
| \-pom.xml // child pom
\-pom.xml // parent pom
子 pom は空ですが、親 pom には単純なシナリオのようにプロファイルがあります。ディレクトリ出力からinheritance/child/dir
実行されているディレクトリの存在に関係なく:mvn help:all-profiles
child
Profile Id: P1 (Active: false , Source: pom)
Profile Id: P2 (Active: false , Source: pom)
mvn help:effective-pom
ディレクトリから実行child
すると、プロファイルが実際に継承されていないことが示されます。文書化されているように動作します:
マージされる POM の要素は次のとおりです。
- 依存関係
- 開発者と貢献者
- プラグイン リスト (レポートを含む)
- ID が一致するプラグインの実行
- プラグイン構成
- 資力
ここにはプロフィールは記載されていません。
プロジェクト集計
ディレクトリ構造:
aggregation
|--module
| \-pom.xml // module pom
\-pom.xml // aggregator pom
モジュール pom は空ですが、アグリゲーター pom には単純なシナリオのようにプロファイルがあります。ディレクトリ出力からaggregation/module/dir
実行されているディレクトリがない場合:mvn help:all-profiles
module
Profile Id: P1 (Active: true , Source: pom)
Profile Id: P2 (Active: false , Source: pom)
ディレクトリ出力からaggregation/module/dir
実行されているディレクトリがある場合:mvn help:all-profiles
module
Profile Id: P2 (Active: true , Source: pom)
Profile Id: P1 (Active: false , Source: pom)
mvn help:effective-pom
ディレクトリから実行module
すると、プロファイルが継承されていることが示されます。これは明示的に文書化されていません:
プロジェクトの継承
複数の Maven プロジェクトがあり、それらの構成がすべて類似している場合、それらの類似した構成を引き出して親プロジェクトを作成することにより、プロジェクトをリファクタリングできます。したがって、Maven プロジェクトにその親プロジェクトを継承させるだけで、それらの構成がすべてのプロジェクトに適用されます。
ノート:
- 示されているように、これはプロファイルには当てはまりません。
- ディレクトリから Maven ビルド
inheritance
を実行すると、親ビルドのみが実行されます。
プロジェクト集計
また、一緒にビルドまたは処理されるプロジェクトのグループがある場合は、親プロジェクトを作成し、その親プロジェクトにそれらのプロジェクトをモジュールとして宣言させることができます。そうすることで、親を構築するだけで済み、残りは続きます。
ノート:
- ディレクトリから Maven ビルド
aggregation
を実行すると、各モジュールとアグリゲーターのビルドが実行されます (実際の順序は、さまざまな基準に基づいて Maven によって決定されます)。
結論
プロファイルは、ユーザーごと、またはプロジェクトごとにグローバルに定義できます。集約されたプロジェクトは一緒に (同じビルドで) ビルドされるため、アクティブなプロジェクトを計算するには、ある種のプロファイル解決を実行する必要があります。したがって、これは紛らわしい部分です:
- プロジェクトが継承される場合、プロファイルは親 pom から子 pom に継承されません 。
- プロジェクトが集約されると、プロファイルは アグリゲーター pom からモジュール pom に継承されます。
これは、Maven 3.1.0 を使用してテストされました。および 3.0.5。