CLOVER🍀

That was when it all began.

Versions Maven Pluginで、プロジェクトのバージョンを変更する

Mavenで、プロジェクトのバージョン自体はpom.xmlのproject.versionに書くわけですが、このバージョン番号を
更新する時ってどうするんでしょう?

特に、マルチプロジェクト構成にしたりしていると、ひとつひとつを変えていくのは面倒ですよね。

よく見かける情報ではMaven Release Pluginを使うといい、みたいなのを見るのですが、バージョン管理システムとの
連動だったりがあって若干敷居の高さを感じます。

Maven Release plugin – Introduction

もうちょっとシンプルにバージョンだけを変更できる手段はないでしょうか?

で、調べてみると、Versions Maven Pluginでできそうな感じです。

Versions Maven Plugin – Introduction

Versions Maven Pluginは、以前にも取り上げたことがあって、この時はプロジェクトが依存しているライブラリの
最新バージョンを確認したり、依存するバージョンを更新できたり、みたいなことで使いました。

Mavenでの依存ライブラリの最新バージョンを表示、更新したりできるVersions Maven Plugin - CLOVER

で、今回の用途の場合は「versions:set」を使えばいいみたいです。

Versions Maven Plugin – versions:set

試してみましょう。

プロジェクトのバージョンを更新してみる

まず、対象として次のようなマルチプロジェクト構成のMavenプロジェクトがあるものとします。

$ find test-project -name pom.xml
test-project/pom.xml
test-project/sub-project1/pom.xml
test-project/sub-project2/pom.xml

現在のバージョンを見てみましょう。

$ cd test-project

現時点で、プロジェクトのバージョンは「0.1」とします。

$ mvn clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] test-project
[INFO] sub-project1
[INFO] sub-project2
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building test-project 0.1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test-project ---
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sub-project1 0.1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ sub-project1 ---
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sub-project2 0.1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ sub-project2 ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] test-project ....................................... SUCCESS [  0.572 s]
[INFO] sub-project1 ....................................... SUCCESS [  0.002 s]
[INFO] sub-project2 ....................................... SUCCESS [  0.002 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.690 s
[INFO] Finished at: 2017-06-13T23:40:04+09:00
[INFO] Final Memory: 6M/201M
[INFO] ------------------------------------------------------------------------

では、これを0.2に変えてみます。

「mvn versions:set」を実行。

$ mvn versions:set

対話形式でバージョンを聞かれるので、ここでは「0.2」と入力してみます。

[INFO] --- versions-maven-plugin:2.3:set (default-cli) @ test-project ---
Enter the new version to set 0.1: : 0.2

すると、各プロジェクトのバージョンが「0.2」に更新されます。

[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /path/to/test-project
[INFO] Processing change of org.littlewings.test:test-project:0.1 -> 0.2
[INFO] Processing org.littlewings.test:test-project
[INFO]     Updating project org.littlewings.test:test-project
[INFO]         from version 0.1 to 0.2
[INFO] 
[INFO] Processing org.littlewings.test:sub-project1
[INFO]     Updating parent org.littlewings.test:test-project
[INFO]         from version 0.1 to 0.2
[INFO] 
[INFO] Processing org.littlewings.test:sub-project2
[INFO]     Updating parent org.littlewings.test:test-project
[INFO]         from version 0.1 to 0.2
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] test-project ....................................... SUCCESS [ 42.370 s]
[INFO] sub-project1 ....................................... SKIPPED
[INFO] sub-project2 ....................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 43.047 s
[INFO] Finished at: 2017-06-13T23:41:38+09:00
[INFO] Final Memory: 18M/285M
[INFO] ------------------------------------------------------------------------

各サブプロジェクトも含め、pom.xmlが更新されます。

ちなみに、「-DnewVersion」で対話形式でなく、一気に変更することもできます。

$ mvn versions:set -DnewVersion=0.2

変更を確定する、もしくは破棄する

「versions:set」でバージョンを変更できたと思いきや、まだ確定はできていません。依存ライブラリのバージョンを変更した時も
そうだったのですが、「pom.xml.versionsBackup」というバージョン変更前のファイルができています。

$ find ./ -type f | grep pom.xml
./pom.xml
./sub-project1/pom.xml
./sub-project1/pom.xml.versionsBackup
./sub-project2/pom.xml
./sub-project2/pom.xml.versionsBackup
./pom.xml.versionsBackup

この「pom.xml.versionsBackup」には、前のバージョン(今回の例では「0.1」)の状態のpom.xmlのバックアップになっています。

変更を確定するには、「versions:commit」を行います。

$ mvn versions:commit

Versions Maven Plugin – versions:commit

これで、変更が確定します。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] test-project
[INFO] sub-project1
[INFO] sub-project2
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building test-project 0.1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.3:commit (default-cli) @ test-project ---
[INFO] Accepting all changes to /path/to/test-project/pom.xml
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sub-project1 0.1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.3:commit (default-cli) @ sub-project1 ---
[INFO] Accepting all changes to /path/to/test-project/sub-project1/pom.xml
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sub-project2 0.1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.3:commit (default-cli) @ sub-project2 ---
[INFO] Accepting all changes to /path/to/test-project/sub-project2/pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] test-project ....................................... SUCCESS [  1.444 s]
[INFO] sub-project1 ....................................... SUCCESS [  0.196 s]
[INFO] sub-project2 ....................................... SUCCESS [  0.004 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.203 s
[INFO] Finished at: 2017-06-13T23:49:55+09:00
[INFO] Final Memory: 17M/285M
[INFO] ------------------------------------------------------------------------

「pom.xml.versionsBackup」ファイルは、なくなります。

$ find ./ -type f | grep pom.xml
./pom.xml
./sub-project1/pom.xml
./sub-project2/pom.xml

反対に、変更を破棄するには「versions:revert」を実行します。

$ mvn versions:revert

Versions Maven Plugin – versions:revert

これで、変更前の状態に戻ります。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] test-project
[INFO] sub-project1
[INFO] sub-project2
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building test-project 0.2
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.3:revert (default-cli) @ test-project ---
[INFO] Restoring /path/to/test-project/pom.xml from /path/to/test-project/pom.xml.versionsBackup
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sub-project1 0.2
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.3:revert (default-cli) @ sub-project1 ---
[INFO] Restoring /path/to/test-project/sub-project1/pom.xml from /path/to/test-project/sub-project1/pom.xml.versionsBackup
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sub-project2 0.2
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.3:revert (default-cli) @ sub-project2 ---
[INFO] Restoring /path/to/test-project/sub-project2/pom.xml from /path/tor/test-project/sub-project2/pom.xml.versionsBackup
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] test-project ....................................... SUCCESS [  0.811 s]
[INFO] sub-project1 ....................................... SUCCESS [  0.053 s]
[INFO] sub-project2 ....................................... SUCCESS [  0.005 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.363 s
[INFO] Finished at: 2017-06-14T00:00:36+09:00
[INFO] Final Memory: 17M/285M
[INFO] ------------------------------------------------------------------------

使いどころはピンポイントかもしれませんが、知っておくと便利…かもしれませんね。