@ rich-sellerの回答と@Bostoneの自己回答を拡張するために、親POMがいくつかのプロファイルを代替として定義し、子POMがデフォルトでこれらのプロファイルの1つを選択する設定を行うことは不可能のようですが、子の選択を一時的に(つまりCLIで)オーバーライドします。フレームワークと関連するプラグインを使用するプロジェクトの親POMについて考えてみます。どちらのバージョンも、プロパティによって定義されていると想定できます。
<profiles>
<profile>
<id>newest</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<framework.version>2.0</framework.version>
<plugin.version>2.0</plugin.version>
</properties>
</profile>
<profile>
<id>older</id>
<activation>
<property>
<name>older.framework</name>
<value>true</value>
</property>
</activation>
<properties>
<framework.version>1.1</framework.version>
<plugin.version>1.1</plugin.version>
</properties>
</profile>
</profiles>
これで、この親POMから継承する子は、デフォルトで2.0を使用する-Polder
か-Dolder.framework=true
、古いフレームワークでビルドしようとします(互換性のテストなど)。ただし、子POMに書き込むことはできません
<properties>
<older.framework>true</older.framework>
</properties>
older
プロファイルを自動的にアクティブにします。デフォルトでアクティブでない場合は、ファイルベースのアクティベーションを使用してこのモジュールを1.1に対してビルドすることができますnewest
が、2.0に対して一時的に実行するのは簡単ではありません。他のプロファイルを明示的に無効にする必要がありますが、それらが多数ある場合は不合理です。したがって、プロファイル情報を子POMにコピーする以外に解決策はありません。older
newest
-Pnewest
<properties>
<framework.version>1.1</framework.version>
<plugin.version>1.1</plugin.version>
</properties>
この時点で-Pnewest
は、これらのプロパティを上書きすることはできないため、を使用する必要があります-Dframework.version=2.0 -Dplugin.version=2.0
。
つまり、プロファイルは、すべての子モジュールがデフォルトで同じプロファイル(ここ)を使用できる場合にのみ役立ちnewest
ます。それらのいくつかが通常1.1で構築され、いくつかが2.0で構築されている場合、プロファイルは役に立ちません。
これは、Mavenコア拡張、またはおそらくMaven3ビルド拡張のユースケースのようです。http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activatorsとhttps://github.com/maoo/maven-tilesが思い浮かびます。