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


113

私のpom.xmlにはプロファイルがあり、明示的に非アクティブ化しない限り、常にアクティブでなければなりません(-P!firstProfile)。activeByDefaultフラグを使用してこれを解決しました:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>

これで、同じpom.xmlに2番目のプロファイルが定義されました。これは、プロファイルが実際にアクティブ化されている場合にのみアクティブになるはずです(-P secondProfile)。したがって、デフォルトの動作は、firstProfileがアクティブ、secondProfileが非アクティブです。別の時点で、最初のプロファイルに加えて2番目のプロファイルをアクティブ化したいと思います。ここでの問題は、 "-P secondProfile"を使用すると、残念ながらfirstProfileが非アクティブになることです。Mavenのドキュメントはこれを述べています:

...このプロファイルは、前述の方法のいずれかを使用して同じPOM内の別のプロファイルがアクティブ化されない限り、すべてのビルドで自動的にアクティブになります。デフォルトでアクティブになっているすべてのプロファイルは、POM内のプロファイルがコマンドラインまたはアクティブ化構成を介してアクティブ化されると、自動的に非アクティブ化されます。...

どういうわけか、firstSettingsを常にアクティブにしておく方法(settings.xmlで宣言する必要なし)はありますか?


回答:


153

1つのトリックはを回避することですactiveByDefault。代わりに、プロパティが存在しないことでプロファイルをアクティブにします。例:

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

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

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


これはどのような状況で役立ちますか、プロファイル自体を明示的に言及するよりも優れていますか?つまり、-DmyFlagを渡す代わりに、-PmyDefaultProfileを正しく実行できますか?欠落しているフラグを使用して制御するメリットはありますか?
Chetya 2017年

1
フラグがない場合、プロファイルは自動的にアクティブになるためです。firstProfile指定した場合にのみプロファイルが無効になります-DskipFirstProfile(例:)mvn verify -DskipFirstProfile
seanf 2017年

25

そんな可能性があったらいいのに、見逃してしまいました。私が見つけることができる唯一の関連するJIRAの問題はこれです:

MNG-4917:activeByDefaultがtrueに設定されていても、プロファイルがアクティブではない

そして、として解決されましたNot A Problem

activeByDefaultこの「オールオアナッシング」のアプローチは私にとって価値がなくなったため、の使用をやめました。


この動作を変更する唯一の方法は、の独自の置き換えを記述しDefaultProfileSelector、それをplexusコンポーネントとして登録し、それ@Component( role = ProfileSelector.class )を配置することです${MAVEN_HOME}/lib/ext(そのようにして、デフォルトのプロファイルセレクタとして選択されます)。(Maven 3.0.2 以前を使用${MAVEN_HOME}/bin/m2.confしている場合は、ロードlib/extする前にロードするために編集する必要もありますlib


代わりに、基本構成を再利用できるようにするために、プロファイル継承またはプロファイル装飾を使用できます。
11年

@crowne間違いなく、はい。それを機能リクエストとして提案してみませんか?
Sean Patrick Floyd、

これは一種の関連です...モジュールを実行から削除する方法はないと思ったので、デフォルトのプロファイルにすべてのモジュールを追加するのが好きです。3.2.1では、ここに示すようにこれを追加しまし。誰かがここでつまずいて、私と同じ理由でモジュールを使用している場合に備えて、このコメントを残しておきます。
キャプテンマン

10

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

お使いのうち、単にリストactiveProfilesあなたの中にsettings.xml、そのように:

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>

my-awesome-profile、私は、データベースのURLなどのような設定を持っているので、彼らは常に適用されます。ここでは、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がまだアクティブであることに注意してください。わーい!


4

次のように、コマンドラインでアクティブ化するすべてのプロファイルを一覧表示できます。

-Pプロファイル1、プロファイル2

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


7
それは完全に真実ではありません。プロファイルを手動でアクティブにすると、プロファイル-Pのみが非アクティブになり<activeByDefault>ます。でアクティブ化され<activeProfiles>たプロファイルは、明示的に非アクティブ化されない限りsettings.xml<activation>アクティブのままになります。
Sam Hanes

4

プロファイルは、POMに注文を入れるための良い方法です。特に、異なる目的で同じプラグインの複数の実行を使用する場合。

ファイルの使用:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>

これは常にtrueになります(Mavenの起動中に誰かがディレクトリを削除しない限り:)。Maven 3.6.0でテスト済み。

また、プロジェクトのタイプを区別するための良い方法かもしれません。たとえば、私のプロジェクトは常にmodule.json存在しています。

プロファイルをアクティブにする拡張機能の使用

プロファイルをアクティブにするためのMaven拡張機能がいくつかあります。そのうちの1つはここにあります:https :
//github.com/OndraZizka/el-profile-activator-extension


1
小さな修正のようです<file><exists>.</exists></file>
revau.lt

-1

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

プロファイルを使用しているからといって、実行中のすべてがプロファイル内にある必要があるという意味ではありません。


これは質問の答えにはなりません-OPは、プロファイルが「明示的に非アクティブ化されない限り、常にアクティブである必要がある」と明示的に述べています。おそらくそれを明示的に無効にする必要があるかもしれませんが、これはこの回答では許可されていません。
sleske
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.