Pom.xmlには、明示的に非アクティブ化されていない限り、常にアクティブなプロファイルがあります(-P!firstProfile)。 activeByDefaultフラグを使用してこれを解決しました。
<profiles>
<profile>
<id>firstProfile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
...
</profile>
</profiles>
同じpom.xmlで、2番目のプロファイルが定義されています。これは、プロファイルが実際にアクティブになっている場合にのみアクティブになります(-P secondProfile)。したがって、デフォルトの動作は、firstProfile active、secondProfile inactiveです。他のいくつかの時点で、最初のプロファイルに加えて2番目のプロファイルをアクティブにしたいと思います。問題は、「-P secondProfile」でこれを行うと、残念ながらfirstProfileが非アクティブになることです。 Mavenドキュメントには次のように記載されています。
...このプロファイルは、同じPOM内の別のプロファイルが前述の方法のいずれかを使用してアクティブにされない限り、すべてのビルドに対して自動的にアクティブになります。デフォルトでアクティブになっているすべてのプロファイルは、POMのプロファイルがコマンドラインまたはアクティブ化構成でアクティブ化されると、自動的に非アクティブ化されます。 ...
(settings.xmlで宣言することなく)firstProfileを常にアクティブに保つ方法はどういうわけですか?
1つの秘isは、activeByDefault
を避け、代わりにプロパティがないことでプロファイルをアクティブにすることです。例えば:
<profiles>
<profile>
<id>firstProfile</id>
<activation>
<property>
<name>!skipFirstProfile</name>
</property>
</activation>
...
</profile>
</profiles>
その後、-DskipFirstProfile
または-P !firstProfile
を使用してプロファイルを非アクティブにできますが、そうでない場合はプロファイルがアクティブになります。
そのような可能性があればいいのにと思って、私はしばしばそれを逃しました。私が見つけた関連するJIRAの唯一の問題はこれです:
MNG-4917:activeByDefaultがtrueに設定されているにもかかわらず、プロファイルがアクティブではない
そして、それはNot A Problem
として解決されました。
私はactiveByDefault
の使用をやめました。なぜなら、この「オールオアナッシング」アプローチは私にとって価値がないからです。
この動作を変更する唯一の方法は、 DefaultProfileSelector
の独自の置換を記述し、@Component( role = ProfileSelector.class )
で神経叢コンポーネントとして登録し、${MAVEN_HOME}/lib/ext
に入れることです(その方法デフォルトのプロファイルセレクタとして選択されます)。 (Maven 3.0.2以前を使用している場合は、lib
をロードする前に${MAVEN_HOME}/bin/m2.conf
を編集してlib/ext
をロードする必要もあります)
この質問は古くからありますが、activeProfile
ではなくactiveByDefault
を使用することで問題を解決できるようです。私はMaven 3.3.9を使用していますが、ソリューションは以前のバージョンでも動作する可能性があります。
settings.xml
にactiveProfiles
をリストするだけです。
<settings>
<profiles>
[...]
</profiles>
<activeProfiles>
<activeProfile>my-awesome-profile</activeProfile>
</activeProfiles>
</settings>
my-awesome-profile
には、データベースURLなどの設定があるため、alwaysが適用されます。ここで、2番目のプロファイルresolve-from-central
をアクティブにします。
$ mvn help:all-profiles -P resolve-from-central
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom ---
[INFO] Listing Profiles for Project: org.Apache.maven:standalone-pom:pom:1
Profile Id: resolve-from-central (Active: true , Source: settings.xml)
Profile Id: my-awesome-profile (Active: true , Source: settings.xml)
Profile Id: resolve-from-internal (Active: false , Source: settings.xml)
my-awesome-profile
がまだアクティブであることに注意してください。わーい!
コマンドラインで、アクティブ化するすべてのプロファイルを次のように単純にリストできます。
-P profile-1、profile-2
mavenは、複数のプロファイルのアクティブ化を自動的に許可するように設計されていますが、-Pでオーバーライドすると、パラメーターにリストされているプロファイルのみがアクティブ化されます。
プロファイルは、POMに何らかの秩序をもたらす良い方法です。特に、異なる目的のために同じプラグインの複数の実行を使用する場合。
<profile>
<id>alwaysActive</id>
<activation>
<file><present>.</present></file>
</activation>
...
</profile>
これは常に真になります(Mavenの起動中に誰かがディレクトリを削除しない限り:)。 Maven 3.6.0でテスト済み。
また、プロジェクトのタイプを区別する良い方法かもしれません。たとえば、私のプロジェクトには常にmodule.json
プレゼント。
プロファイルをアクティブにするためのMaven拡張機能がいくつかあります。ここのフォークの1つ:
https://github.com/OndraZizka/el-profile-activator-extension
デフォルトのプロファイルをアクティブに保つことはできませんが、そのプロファイルのコンテンツ(例では...)を取得して、pomのメインセクションに移動することはできます。
あなたがプロファイルを使用しているという理由だけで、それはあなたがしているすべてがプロファイル内にある必要があることを意味しません。