2009-10-01 11 views
20

シナリオに基づいて、子プロファイルをアクティブ:Mavenの - プロパティ

  1. 使用されます
    1. 親(モジュールとして)プロファイルと子を定義POM
    2. 子プロジェクト(複数可)を考えます親POMを参照してプロファイルを作成する。
  2. 意図が親で、プロファイルの実行をスキップして、子供にそれを実行することである親がfooプロパティを定義していませんのでだけ
  3. プロファイルは、起動部<activation><property><name>foo</name></property><activation>
  4. を持っている - プロファイルが非アクティブではありません親ビルドのために実行
  5. 子ビルドが実行され、プロファイルがアクティブになるときにプロパティが選択されることを希望して、子に<properties><foo>true</foo></properties>を定義します。そのような運はありません。プロファイルは決して活性化されません。これは、プロパティが設定されないことを示しています。ただ、注意すべき
  6. mvn package -Dfoo=trueは、両方の親にプロファイルをアクティブにし、子

私は不可能またはちょうどそれが間違っているのをやろうとしているだろうか?

P.S. Hmmm - 私が親にプロパティを定義しても、プロファイルはトリガーされません。何がありますか?

答えて

7

@リッチセラーの答えと@ボストンの自己回答を拡大するには、親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プロファイルが自動的に起動することはできません。 newestがデフォルトでアクティブではない場合、ファイルベースのアクティブ化を使用して1.1に対してビルドを行うことができますが、2.0に対して一時的に実行するのは容易ではありません:私が知る限り、oldernewestの両方のプロファイルがアクティブになります。 -Pnewestを渡したので、明示的に他のプロファイルを無効にする必要があります。あなたが-Dframework.version=2.0 -Dplugin.version=2.0を使用する必要があるので、ポイント-Pnewestない仕事は、これらのプロパティをオーバーライドするだろう

<properties> 
    <framework.version>1.1</framework.version> 
    <plugin.version>1.1</plugin.version> 
</properties> 

れる:だから子POMにプロファイル情報をコピーする以外だけで解決策はありません。

つまり、プロファイルはすべての子モジュールがデフォルトで同じプロファイル(ここではnewest)を使用できる場合にのみ便利です。それらのうちのいくつかが通常1.1でビルドされていて、2.0でビルドされているものがあれば、そのプロファイルは役に立たない。

Mavenコアエンハンスメント、またはおそらくMaven 3ビルド拡張のユースケースです。 http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activatorshttps://github.com/maoo/maven-tilesが気になります。

+0

を参照するのが大好きですね。私はそれが私の答えを構築し、私は一般的に自分自身を受け入れるのが好きではないので、これを受け入れている – Bostone

+0

非常に有用な情報。そしてファイルベースのアクティブ化についてのヒントをお寄せいただきありがとうございます。私の問題を非常にきれいに解決しました。 – Allan

5

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

コマンドラインからプロパティを渡したり、settings.xmlでプロファイルのアクティブ化を指定したり(一般的には素晴らしいアイデアではない)しない限り、このアプローチではちょっとしたことになります。私のprevious answerの回避策は、マーカーファイルの存在を使用する。

Maven 2.1.0以降を使用している場合は、を無効にしてください。親POMのコマンドラインからのみプロファイルを無効にしてください。これはまだ明らかに理想的ではありません。

プロファイルを無効にするには、文字 '!'または「 - 」のように:それはモジュールのいずれかで有効化/無効化プロフィールへ不可能あるので、ビルドが実行される前に、マルチモジュールのビルドにすべてのプロパティが設定されています

mvn install -P !profile-1,!profile-2 
+0

私は恐れていました。実際にはプロファイルの実行が設定されており、ビルドが開始された後では(マーカーファイルを使用しても)変更することはできません。これらの-1と-2は何を指しているのですか?私が親と子を持っていて、 "ビルド"プロファイルがある場合、次のように親のプロファイルを取り消すとしますか? (私のテストではそうではありません) 'mvn install -P!buiild-1' – Bostone

+0

私はそれを正確には受け取りません。 ''または ''プロファイルトリガはあなたのためにうまくいかないのですが? –

+0

この例では、 'profile-1'と' profile-2'と呼ばれる2つのプロファイルを無効にすることです。 '-1'や' -2'には特別な意味はありません。あなたの場合は単に 'mvn install -P!build'となるでしょう –

5

直接自分の質問に答えるために子供のPOMの特性を設定することに基づいてビルド。しかし、あなたが他の手段を使ってそれを行う方法を探しているならば、read this comment

関連する問題