マルチモジュールMavenプロジェクトのモジュールのバージョン番号の更新


325

マルチモジュールのmavenプロジェクトがあります。これらすべてのモジュールを一緒にバージョン管理するつもりです。しかし、今のところ、以下のようにpom.xmlの各モジュールでハードコーディングバージョンを作成しています。

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

メインの親モジュールには以下の構成があります

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>

1
あなたの質問は誤って記載されており、真のマルチモジュール(「集約」)POMを持っている人々を混乱させます。あなたの例とその回答から、マルチモジュールではなく、親POM、集約POMについて話しているように見えます。maven.apache.org/pom.html#Aggregationを参照してください。
Garret Wilson

回答:


631

versions-mavenプラグインversions:setから使用:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

マルチモジュールプロジェクトのすべてのpomバージョン、親バージョン、依存関係バージョンを調整します。

間違えた場合は、

mvn versions:revert

その後、または

mvn versions:commit

結果に満足している場合。


注:このソリューションでは、すべてのモジュールが集約pomを親pomとしても使用することを想定しています。このシナリオでは、この回答の時点で標準と見なされていました。そうでない場合は、ギャレットウィルソンの回答参考にしてください


5
各モジュールを実際に変更する必要のない解決策があれば、すばらしいと思います。私が考えることができる唯一の代替案は、常に親POMのスナップショットバージョンを使用することです。
AmanicA 2011

54
さらに、デフォルトでこのプラグインが元のpomファイルをバックアップversions:setするため、を指定できます-DgenerateBackupPoms=false
Maksim Sorokin、

20
それがポイントですversions:commit:「pomの初期バックアップを削除し、それによって変更を受け入れます。」
Michael Laffargue、2014

2
:新しいプラグインが異なり、この質問に記載されている問題解決mojo.codehaus.org/flatten-maven-plugin/examples/...
シュテファン・

1
@MichaelLaffargue mvn versions:commitは、以前のpom.xmlで生成されたバックアップファイルを削除するようです
Cris Rockwell

58

与えられた答えは、問題のプロジェクトがモジュール集約に加えてプロジェクト継承を使用することを前提としています。実際、これらは異なる概念です。

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

一部のプロジェクトはモジュールの集約である可能性がありますが、アグリゲーターPOMと集約されたモジュールの間には親子関係がありません。(親子関係がまったくない場合や、子モジュールが個別のPOMを完全に「親」として使用する場合があります。)これらの状況では、指定された回答は機能しません。

よく読んで実験した結果、Versions Mavenプラグインを使用して、アグリゲーターPOMだけでなく、すべての集約モジュールも更新する方法があることがわかりました。それはprocessAllModulesオプションです。次のコマンドは、アグリゲータープロジェクトのディレクトリで実行する必要があります。

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

バージョンMavenプラグインは、含まれているすべてのモジュールのバージョンを更新するだけでなく、モジュール間の依存関係も更新します!!!! これは大きな勝利であり、多くの時間を節約し、あらゆる種類の問題を防ぎます。

もちろん、すべてのモジュールの変更をコミットすることを忘れないでください。これは、同じスイッチで実行することもできます。

mvn versions:commit -DprocessAllModules

完全にバックアップPOMSを省いて、すべてを1つのコマンドで実行することもできます。

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false

ビルドヘルパープラグインと同様に、次のバージョンをどのように自動化しますか?
lostintranslation

Maven 3.5.0を使用してこれを機能させることができません。プロジェクトの集約があり、親pomのみが更新されました。私はまた、プロジェクトの継承(集計と一緒に-提供されたリンクからの「すべての3つのルール」)を試行し、再び親pomのみが更新されました。
SiKing

1
秘密のmake-it-workスイッチが見つかりました。親pomとモジュールの開始バージョンは同じでなければなりません!私の親pomは「1-SNAPSHOT」で始まり、モジュールには「1.0.0-SNAPSHOT」がありました。:)
SiKing

1
アグリゲータープロジェクトでは、アグリゲーターのバージョンとサブモジュールのバージョンが同じである必要ありませ。(たとえば、アグリゲーターpomはめったに変更されず、特定のバージョンにとどまることができますが、個々のサブモジュールは独自のリリースサイクルを持つことができます)。versions:setプラグインに指定する重要なプロパティはです。mojohaus.org/ versions-maven- plugin / set-mojo.htmlでは-DoldVersion='*'、このプロパティはアグリゲータープロジェクトの処理時に指定する必要があることを明示しています。
Matthew Wise、

2
-DprocessAllModules実際に機能するのはどのような条件ですか?私にはうまくいきません。
Alex R

24

プロセスを完全に自動化したい場合(つまり、現在のバージョン番号を知らなくてもバージョン番号を増やしたい場合)は、次のようにできます。

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
おかげで、@ Crummy、あなたは私の日を救いました
マクシム


または使用できます-DoldVersion='*'
マシューワイズ

23

Mavenリリースプラグインのrelease:update-versionsゴールを調べてみてください。親のバージョンとその下のすべてのモジュールを更新します。


更新:上記はリリースプラグインであることに注意してください。リリースしていない場合は、使用することができますversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
mvn version:setはモジュールに影響しません。
9ilsdx 9rvj 0lo


リアクタービルドが同時に親である場合は問題ありません。構造が他のように見えると混乱します...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodules私は:-)解放しておりません場合でも、私のために罰金を働いた
MSA

11

マルチモジュール(リアクター)ビルドについてMaven Bookを読むことをお勧めします。

私は特に以下を意味しました:

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

に変更する必要があります。ここでは、定義されている親部分でのみ定義されていないバージョンに注意してください。

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

これはより良いリンクです。


10
具体的に何を探しますか?
–ThorbjørnRavn Andersen 2013

2
pom.xmlファイルの適切なフォーマットを提示するための+1ですが、この情報について本全体を読むのはやり過ぎであることに(@ThorbjørnRavnAndersenと)同意します。:p
Priidu Neemre

7
残念ながら、親からバージョン情報を継承しても、プロジェクト内のすべてのpomファイルを変更なければならないという負担はなくなりません。これらはすべて、バージョン番号で親を参照するためです。
Steven the Easy

1
このすべてを処理するversions-maven-pluginを使用するか、maven-release-pluginを使用して、手動で処理する必要はありません...
khmarbaise

5

versions:update-child-modulesあなたが探しているもののように聞こえます。前述のようにversions:setを実行することもできますが、これは親バージョン番号を更新する簡単な方法です。子モジュールについては<version>、親モジュールのバージョン番号を継承するため、定義を削除する必要があると私は考えています。


3

最善の方法は、モジュールを一緒にバンドルするつもりなので、タグのすぐ下の<dependencyManagement>最も外側pom.xml(親モジュール)で<project>タグを指定できることです。バージョンとグループ名を制御します。個々のモジュールでは、で<artifactId>タグを指定するだけですpom.xml。親ファイルからバージョンを取得します。


pom.xmlに依存関係タグが見つかりません。何か考えていますか?
ArturoTena 2014

0

最も簡単な方法は、すべてのpom.xmlのバージョンを任意のバージョンに変更することです。次に、その依存関係管理をチェックして、このモジュールで使用されているモジュールの正しいバージョンを使用してください!たとえば、towモジュールプロジェクトのバージョン管理を増やしたい場合、uは次のように実行する必要があります。

子モジュールで:

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

と親モジュールで:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>

0

サブモジュールのメインのpom.xmlと親バージョンを更新するには:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.