web-dev-qa-db-ja.com

別のプロファイルがアクティブになった場合でも、activeByDefaultであるMavenプロファイルをアクティブに保つ方法

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を常にアクティブに保つ方法はどういうわけですか?

98
Peter

1つの秘isは、activeByDefaultを避け、代わりにプロパティがないことでプロファイルをアクティブにすることです。例えば:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

その後、-DskipFirstProfileまたは-P !firstProfileを使用してプロファイルを非アクティブにできますが、そうでない場合はプロファイルがアクティブになります。

参照: Maven:完全なリファレンス、プロファイルのアクティブ化-プロパティの不在によるアクティブ化

139
seanf

そのような可能性があればいいのにと思って、私はしばしばそれを逃しました。私が見つけた関連する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をロードする必要もあります)

22

この質問は古くからありますが、activeProfileではなくactiveByDefaultを使用することで問題を解決できるようです。私はMaven 3.3.9を使用していますが、ソリューションは以前のバージョンでも動作する可能性があります。

settings.xmlactiveProfilesをリストするだけです。

<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がまだアクティブであることに注意してください。わーい!

7
inanutshellus

コマンドラインで、アクティブ化するすべてのプロファイルを次のように単純にリストできます。

-P profile-1、profile-2

mavenは、複数のプロファイルのアクティブ化を自動的に許可するように設計されていますが、-Pでオーバーライドすると、パラメーターにリストされているプロファイルのみがアクティブ化されます。

3
Assem

プロファイルは、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

0
Ondra Žižka

デフォルトのプロファイルをアクティブに保つことはできませんが、そのプロファイルのコンテンツ(例では...)を取得して、pomのメインセクションに移動することはできます。

あなたがプロファイルを使用しているという理由だけで、それはあなたがしているすべてがプロファイル内にある必要があることを意味しません。

0
Daniel Stolz