現在のモジュールに応じて異なる Maven プロファイルをアクティブにしますか?
質問
Java や Flex など、さまざまなテクノロジーを使用したモジュールを含むマルチモジュール ビルドがあります。現在コンパイルされているモジュールに基づいて、さまざまなプロファイルをアクティブにすることはどういうわけか可能ですか?
のようなアクティベーションで試してみました
<profile>
<id>flex</id>
<activation>
<file>
<exists>${basedir}/src/main/flex</exists>
</file>
</activation>
...
</profile
しかし、${basedir} の使用は機能しませんでした。 Maven ドキュメントに記載されています (これは Maven のバグです)。現在のモジュールに基づいて異なるアクティベーションが行われる可能性はありますか?それとも、Maven はすべてのモジュールのプロファイルのアクティブ化のみを許可するのでしょうか、それともまったく許可しないのでしょうか?
解決
この質問を読んで答えを探している私のような人のために、このユースケースはMaven 3で動作するようになりました。
3の初期バージョンでは、この機能に影響するバグがありました( http:// jiraを参照してください.codehaus.org / browse / MNG-2363 )ですが、Maven 3.0.4を使用して正しく動作します。
他のヒント
さらに調査した結果、現在のMavenバージョン(2.1.0)では2つの理由でこれが不可能であるという結論に至りました。
- Mavenプロファイルは継承されないため、親POMでプロファイルを定義し、子POMでプロファイルをアクティブにすることはできません。
- POM自体からプロファイルをアクティブ化する可能性を見つけていません。アクティブ化は、$ {basedir}およびプロパティのアクティブ化応答では機能しません。システム設定は、-Dオプションでグローバルに指定されます。
2.2.1では、プロファイルは継承されますが、$ {basedir}の問題はまだ残っています。私は同じボートにいます-特定のプロジェクト内のファイルの存在に基づいてプロファイルをアクティブにする必要があります。子ビルドは個別に正常に実行されます(ローカルファイルの存在によってアクティブ化された継承プロファイル)が、最上位の親からビルドを実行すると、ファイルが見つからないため失敗します。
ファイルベースのアクティベーションに関しては、$ {basedir}を削除してみてください。このように使用します:
<activation>
<file>
<missing>target/jboss/conf/jboss-service.xml</missing>
</file>
</activation>
これが役立つかどうかはわかりませんが、次のアプローチで同様の問題を解決しました。
- 親 POM にプロファイルを作成して記述しました。
activeByDefault=false
. 。PluginManagement セクションには、さまざまなプラグインの構成が含まれます。 - 子供たちはこのプロファイルを再利用し、設定することができます。
activeByDefault=true
これによりプロファイルがアクティブになりますが、プラグインはまだアクティブ化されていません。 - しかし幸いなことに、説明されているプラグイン構成は利用可能です。Plugins-Section で定義することで、子で再利用できます。グループIDとアーティファクトIDを指定して設定するだけです。
inherited=true
子で再利用したいプラグインごとに。
それが役立つことを願っています。コードスニペットが含まれていないのは申し訳ありませんが、それでも内容が理解できることを願っています。
プロファイルを使用する各モジュールにプロパティを設定し、「プロパティ」を使用できます。プロファイルでのアクティベーション。