27

シナリオ:

  1. 与えられた
    1. プロファイルと子(モジュールとして)を定義する親POM
    2. 親POMを参照してプロファイルを使用する子プロジェクト。
  2. 目的は、親でのプロファイルの実行をスキップし、子でのみ実行することです。
  3. プロファイルにはアクティベーションセクションがあります<activation><property><name>foo</name></property><activation>
  4. 親はプロパティを定義しないためfoo、プロファイルは非アクティブであり、親ビルドに対して実行されません
  5. 今、<properties><foo>true</foo></properties>子ビルドが実行され、プロファイルがアクティブ化されるときにプロパティが取得されることを期待して、子で定義しています。そのような運はありません。プロファイルがアクティブ化されることはありません。これは、プロパティが設定されないことを示しています。
  6. 注意点:mvn package -Dfoo=true親と子の両方でプロファイルをアクティブにします

私は不可能なことをしようとしているのですか、それとも単に間違っているのですか?

PSうーん-親でプロパティを定義しても、プロファイルはトリガーされません。何が得られますか?

4

3 に答える 3

10

@ 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にコピーする以外に解決策はありません。oldernewest-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+Activatorshttps://github.com/maoo/maven-tilesが思い浮かびます。

于 2012-08-29T15:27:09.867 に答える
7

私自身の質問に直接答えるには、マルチモジュールビルドでは、ビルドが実行される前にすべてのプロパティが設定されるため、子POMのプロパティの設定に基づいて、ビルドにモジュールの1つでプロファイルをアクティブ化/非アクティブ化することはできません。ただし、他の手段を使用してそれを行う方法を探している場合は、このコメントをお読みください

于 2009-10-06T17:33:35.930 に答える
6

プロファイルは、コマンドラインから渡されたプロパティによってのみアクティブ化できます。これは、POMのプロパティは、POMが解析された後でのみ処理できるためです。この時点では、プロファイルのアクティブ化を解決するには遅すぎます。

コマンドラインからプロパティを渡すか、settings.xmlでプロファイルのアクティブ化を指定するか(通常はお勧めできません)、以前の回避策を使用できない限り、このアプローチでは少し問題があります。マーカーファイルの存在を使用するための回答。

Maven 2.1.0以降を使用している場合の最後の代替策の1つは、親POMのコマンドラインからのみプロファイルを非アクティブ化することですが、これは明らかに理想的ではありません。

「!」のいずれかの文字を使用してプロファイルを非アクティブ化できます。または「-」のように:

mvn install -P !profile-1,!profile-2
于 2009-10-01T18:34:08.200 に答える