私は、約400個のプラグインを扱う大きなMaven(Tycho)プロジェクトを持っています。
各POMファイルでアプリケーションのバージョンを指定しました。
1つの場所でのみ、すべてのPOMのバージョンを指定する方法はありますか?
私はいくつかのように考えることを期待するでしょう:
<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>
....
<version>${buildVersion}</version>
親はpom.xml
:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>pom</packaging>
次に、各POMには親POMへの参照があります。
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>1.1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>Eclipse-plugin</packaging>
親プロジェクトがある場合、親pomでバージョンを設定でき、子で$ {project.version}または$ {version}で兄弟ライブラリを参照できます=プロパティ。
各子で親のバージョンを繰り返すことを避けたい場合:これを行うことができます:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>
<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>
そして、あなたの子供のポンであなたがしなければならない:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${my.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<packaging>Eclipse-plugin</packaging>
<dependencies>
<dependency>
<groupId>company</groupId>
<artifactId>otherartifact</artifactId>
<version>${my.version}</version>
or
<version>${project.version}</version>
</dependency>
</dependencies>
hth
バージョンのプロパティを使用すると、次の警告が生成されます。
[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
バージョンを切り替えるために複数の場所でバージョンを変更する必要があるという問題がある場合、正しいことは、これを自動的に行うMavenリリースプラグインを使用することです。
3.5以降のMavenバージョンでは、親セクションと残りのpom内でプレースホルダー(例:$ {revision})を使用できるはずです。${project.version}
。
実際には、parent
以外のプロジェクトプロパティを省略することもできます。これらは継承されるためです。結果は次のようになります。
<project>
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${revision}</version> <!-- use placeholder -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>artifact</artifactId>
<!-- no 'version', no 'groupId'; inherited from parent -->
<packaging>Eclipse-plugin</packaging>
...
</project>
詳細、特に公開中にプレースホルダーを解決する方法については、「 Maven CIフレンドリーバージョン|マルチモジュールセットアップ 」を参照してください。
正しい答えはこれです(例のバージョン):
親pom.xmlには、(not inside properties
)が必要です:
<version>0.0.1-SNAPSHOT</version>
すべての子モジュールには次のものが必要です。
<parent>
<groupId>com.vvirlan</groupId>
<artifactId>grafiti</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
そのため、ハードコーディングされています。
さて、バージョンを更新するには次のようにします:
mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
mvn versions:commit # Necessary to remove the backup file pom.xml
400のモジュールすべてで親バージョンが更新されます。
Maven 3を使用している場合、この問題を回避する1つのオプションは、バージョンプラグインを使用することです http://www.mojohaus.org/versions-maven-plugin/
具体的には、コマンド、
mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit
これにより、親と子のPOMが2.0-RELEASEに更新されます。前にビルドステップとしてこれを実行できます。
リリースプラグインとは異なり、ソース管理と通信しようとはしません
Maven-Usersフォーラムを参照してください 'version'には式が含まれていますが、定数である必要があります。新しいバージョンを追加する方法? :
これが悪い計画である理由はここにあります。
デプロイされるPOMのプロパティ値は解決されないため、そのPOMに依存する人は誰でも$ {}で補間されていない文字列として依存関係を取得し、ビルドプロセスで大きな陽気が続きます。
maven 2.1.0および/または2.2.0では、解決されたプロパティでpomsをデプロイしようとしました...これは予想以上に壊れたため、これら2つのバージョンは推奨されません。2.2.1は推奨される2.xバージョンです。