2012-08-17 9 views
13

のmavenでは、次の構文でポンポンでプロパティを設定することは非常に簡単です:Mavenでは、実行時にどのようにプロパティ値を動的に構築できますか?

... 
<properties> 
    <myValue>4.06.17.6</myValue> 
</properties> 
... 

今、私は私のポンポンのバージョンに依存プロパティを構築する必要があります。私は、次の(Javaの擬似コードを)やりたいプロパティを作成するために:それは私たちのリポジトリにタグ名として使用されているため

String[] parts = version.split("\\."); 
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]); 
// example: 4.06.17.6 => V_4_06_17_P6 

それは、ダイナミックでなければならず、常にのバージョンと同期している必要がありますアーティファクト。

"ダイナミック"プロパティを作成する方法はありますか?

答えて

25

モジョのビルドヘルパーMavenのプラグインがここであなたを助けることができます。

プロパティを変換するのに役立つさまざまな目標があります。

おそらくregex-propertyは、あなたが欲しいものですが、あなたのV場合があります水分数値は他の2つがあなたを救うかもしれない "標準"に準拠しています。

あなたが注意

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>tag.version</name> 
       <value>${project.version}</value> 
       <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex> 
       <replacement>V$1_$2_$3_P$4</replacement> 
       <failIfNoMatch>true</failIfNoMatch> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

のようなものだろう regex-property目標を使用するには:あなたは上記をテストする必要がありますので、私の正規表現は少しオフになる場合もありますが。

注:プロパティの値は、この実行がバインドされているフェーズの後でのみ実行できます。バインドされているデフォルトのフェーズはvalidateですが、ライフサイクル(サイトのライフサイクルなど)が異なる場合は値を使用できません。

+0

また、プラグインをフェーズにバインドしない場合は、私はmaven releaseプラグインを使用しており、目標リリース:prepareを呼び出しています。ここでそれを利用できるようにするには? – EhmKah

+0

フェーズを指定しない場合、デフォルトでは 'validate'フェーズにバインドされているため、上記のコードスニペットは、検証フェーズがアクティブなときに目標を実行します。目標を直接呼び出すと'release:prepare'では、ライフサイクルフェーズをスキップして目標を実行するので、' release:prepare'ゴール自体はプロパティを見ることができません。* 'release:prepare'によってライフサイクル*がフォークされますそれ。だから 'release:prepare'はSCMにタグ付けするためのプロパティを使うことができませんが、リリースプラグインが動く分岐したビルドにプロパティが存在します –

+1

SCMタグをプロパティに基づいてこれがあなたの目標であることを反映するための質問、または2番目の質問を開始する)、次にhttp://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html#tagNameFormatのようなものを使用する必要がありますそれはあなたに '_'代入や' _P'注入を与えません。 Mavenを曲げようとするのではなく、タグ名の必要条件を変更することをお勧めします;-) –

2

mavenビルドヘルパープラグイン、特にregex-property mojoを使用できます。 usage examplesをご覧ください(セクションに正規表現の置換を適用してプロパティを設定するとにスクロールします)。

基本的にあなたがmyValueから推測myVersionTagプロパティを取得するためにあなたのポンポンでそのような何かをしたい:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>myVersionTag</name> 
       <value>$\{myValue}</value> 
       <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex> 
       <replacement>V_$1_$2_$3_P$4</replacement> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

私はこの回答が上記のものと同じであるため、この回答にも受け入れられたとマークしていました。ありがとうございました。 – EhmKah

+1

アイホールの例では、 '$'と '{'の間に '\'を入れます(要素)。これは、Codehausの文書がそれを行うと言っているが、それは間違っている。正規表現のプロパティの目標は、バックスラッシュでは機能しません。そしてCodehausは廃業しています。 –

+0

@SteveCohenドキュメントが間違っている場合は、問題を開いてください。https://github.com/mojohaus/build-helper-maven-plugin/issues – khmarbaise

2

Ihor Kaharlichenkoの答えは、Codehaus documentationからのエラーをコピーする以外は基本的には正しいです。 '$'と '{'の間に '\'はないはずです。 モジョはそれなしで動作し、それと動作しません。本当に、正規表現とMavenの基本的な理解で、私はバックスラッシュが何をすべきかを見ることができず、間違っています。

スティーブン・コノリーの答えは、バックスラッシュを正しく省略しています。注意してください。
このエラーはSO全体で広がり、Codehausの廃止はおそらく決して解決されません。

関連する問題