web-dev-qa-db-ja.com

Maven POMのプロパティを更新するにはどうすればよいですか?

backendfrontendという2つのトップレベルのMavenプロジェクトがあり、それぞれ独自のペースでバージョンを進めています。それぞれに複数のモジュールがあるため、親/集約POMのdependencyManagementセクションで依存関係バージョンを定義し、バージョン番号のプロパティを使用します。

frontendのバージョン番号を使用して、できれば任意にプロパティをクリーンに更新したいのですが、一致するライブのアップストリームバージョンが必要な場合でも対応できます。 versions:update-property を使用してみましたが、その目標は完全に機能しないようです。実際に一致するアップストリームバージョンがあるかどうかに関係なく、次のデバッグ出力が表示されます。

$ mvn versions:update-property -Dproperty=frontend.version -DnewVersion=0.13.2  -DautoLinkItems=false -X
...
[DEBUG] Searching for properties associated with builders
[DEBUG] Property ${frontend.version}
[DEBUG] Property ${frontend.version}: Looks like this property is not associated with any dependency...
[DEBUG] Property ${frontend.version}: Set of valid available versions is [0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.13.2, 0.13.3]
[DEBUG] Property ${frontend.version}: Restricting results to 0.13.2
[DEBUG] Property ${frontend.version}: Current winner is: null
[DEBUG] Property ${frontend.version}: Searching reactor for a valid version...
[DEBUG] Property ${frontend.version}: Set of valid available versions from the reactor is []
[INFO] Property ${frontend.version}: Leaving unchanged as 0.13.1
[INFO] ------------------------------------------------------------------------

-DautoLinkItems=falseを指定しましたが、これは効果がないようです。 versions-maven-pluginは引き続き、一致する依存関係についてすべてのPOMをスキャンし、手を上げて終了します。プラグイン設定でそのプロパティのsearchReactorfalseに設定しようとしました。プラグインは、(1)依存関係を無視するように明示的に指定した場合でも、依存関係を誤ってスキャンし、(2)明示的な特定の一致を除外するようです。

バージョン番号を検証せずにversions-maven-pluginに強制的に実行させるか、別の目標を使用して、Mavenプロパティエントリを特定の値に書き換える簡単な方法はありますか? XMLを理解しないsedのようなツールは避けたいと思いますが(同様の質問で推奨されているように)、単純なXPath操作で問題ありません。

26
chrylis

Mavenプロパティエントリを特定の値に書き換える簡単な方法はありますか

バージョン2.5使用できますset-propertyドキュメント ):

mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value

文書化されているように、set-propertyゴールは、指定した値に対して「健全性チェック」を実行しないため、常に機能するはずですが、注意して使用する必要があります。

18
George Aristy

NewVersionパラメータのドキュメントが不適切です(このプラグインのほとんどがそうです)。統合テストを確認すると、単純なバージョン番号ではなく Mavenバージョン範囲 が必要です。また、値を提供することはできません-Mavenが解決できる有効な値でなければなりません。 constrainRangeと呼ばれる場合、パラメーターはより良いでしょう

将来的には、これを試してください:

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]  

スナップショットに更新する必要がある場合は、プロパティallowSnapshotsをtrueに設定してください。

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true
15
drekbour

既存のPOMのプロパティを更新する方法:

maven-resource-plugin でフィルタリングを使用してみてください:

  1. プロパティファイルでバージョンを指定します。
  2. このファイルへのパスを持つカスタムフィルターを追加します(子pom.xml、依存関係を挿入する場所);
  3. プロパティファイルのバージョンを更新します。
  4. ビルドを実行します。

利点:

  • 動作するはずです。
  • バージョンは一度だけ指定されます。
  • プロパティファイルはバージョン管理下で追加できます。
  • process-resourcesは、Mavenの最初のライフサイクルステップの1つです。

短所:

  • pom.xmlはまだプレースホルダーを使用しています。
  • 初期ビルドからプロパティファイルを自動的に更新するための追加作業(複雑すぎるため、簡単な解決策があるはずです)。

ビルド時間に適切な方法:

ビルドパラメーターによって任意のプロパティを指定できます。

たとえば、pom.xmlには次のようなプロパティがあります。

<properties>
    <build.date>TODAY</build.date>
</properties>

ビルド中に変更するには、単にパラメーターを使用します。

mvn compile -Dbuild.date=10.10.2010

バージョンでも機能すると確信しています。また、最上位プロジェクトのプロパティは子に継承されます。

4
arghtype

私は同じ問題を抱えていて、ファイル内のpomプロパティを変更するものは何も見つかりませんでした。私はあなたが提案したようにsedを使用することになりました:

cat pom.xml | sed -e "s%<util.version>0.0.1-SNAPSHOT</util.version>%<util.version>$bamboo_planRepository_branch</util.version>%" > pom.xml.transformed;
rm pom.xml;
mv pom.xml.transformed pom.xml;
2
mojoo-de

以下はバージョンに適用されます:update-propertiesゴール。同じことがversion:update-propertyにも適用されると思います。

デフォルトの目標は、対応するプロパティ定義と依存関係宣言が同じPOMファイルにある場合にのみ機能します。

たとえば、プロパティがプロジェクトPOMで定義されているが、モジュールPOMの依存関係宣言で使用されている場合、バージョンプラグインによる自動更新のためにプロジェクトPOMで次の構成が必要です。

  <properties>
    <my.version>3.7.11</my.version>
  </properties>
...

  <build>
    <plugins>
      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>versions-maven-plugin</artifactId>
         <version>2.2</version>
         <configuration>
           <properties>
            <property>
              <name>my.version</name>
              <dependencies>
                <dependency>
                  <groupId>com.acme.test</groupId>
                  <artifactId>demo-arti</artifactId>
                </dependency>
              </dependencies>
            </property>
          </properties>
        </configuration>
      </plugin>
    </plugins>
  </build>

プラグイン構成は、Versions mavenプラグインがPOMに対して実行され、プロパティを更新しようとすると実行されます。この構成は、現在のPOMにない場合でも、「POMのどこかで」指定された依存関係にプロパティが使用されることをバージョンプラグインに伝えます。

1
Darren Yeats

Pom.xmlでプロパティを定義するときに、update-propertyが機能するようにするには、間隔として宣言する必要があります。

つまり、frontend.versionは次のように定義されていることを確認します。

<frontend.version>0.13.1</frontend.version>

次に、-DnewVersion = 0.13.2を設定すると、プラグインは値を有効な値として認識しません。間隔として定義する代わりに、プラグインが機能します。

<frontend.version>[0.13.0,0.13.2]</frontend.version>

私のテストの1つで、次の結果が得られます。

mvn versions:update-property -Dproperty=absis.version -DnewVersion=[2.20.4] -X


    [DEBUG] Property ${test.version}: Set of valid available versions is [2.19.0-RC-REVISION-1, 2.19.0-RC0.1, 2.19.0-RC0.2, 2.19.0-RC0.3, 2.19.0-RC0.4, 2.19.0-RC0.5, 2.19.0-RC0.6, 2.19.0-RC0.7, 2.19.0-RC1, 2.19.0-RC2, 2.19.0-RC3, 2.19.0, 2.19.0-revision, 2.19.0-revision2, 2.19.0.2, 2.19.1, 2.19.2, 2.19.3, 2.19.4, 2.20.0-RC0, 2.20.0-RC0.1, 2.20.0-RC1, 2.20.0-RC2, 2.20.0-RC3, 2.20.0, 2.20.0-PRUEBA-VERSION, 2.20.0-PRUEBA-VERSION-2, 2.20.0-PRUEBA-VERSION-3, 2.20.0i-RC1, 2.20.0i-RC1.1, 2.20.0i, 2.20.0i.2, 2.20.1, 2.20.2, 2.20.4, 2.20.5, 2.20.5-LT, 2.20.5.1, 2.20.6i-RC1, 2.21.0-RCtest1, 2.21.0-RCtest2]
[DEBUG] Property ${test.version}: Restricting results to [2.20.4,2.20.4]
[DEBUG] Property ${test.version}: Current winner is: 2.20.4
[DEBUG] Property ${test.version}: Searching reactor for a valid version...
[DEBUG] Property ${test.version}: Set of valid available versions from the reactor is []
[INFO] Updated ${test.version} from [2.19.0,2.21.0-SNAPSHOT] to 2.20.4

購入すると、プロパティ値を範囲に変更する必要があります。

残念ながら、pomsの定義では範囲を使用できません。