概要
maven プロジェクトにて、multi-module 構成にした場合、それぞれのバージョニング管理が煩わしかったので、なるべく少ない修正で、 pom.xml を簡潔にしようとした際のまとめです。
前提条件
- maven プロジェクト
- multi-module 構成
環境
$ ./mvnw --version
Apache Maven 3.5.3
Java version: 1.8.0_112, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.5", arch: "x86_64", family: "mac"
$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)
ファイル構成
.
|- parent
| `-- pom.xml
|- tools
| `-- pom.xml
|- web-app
| `-- pom.xml
`- pom.xml
元々やっていたこと
上記のようなファイル構成の中、各々のバージョニングの管理を個別の pom.xml で行なっていました。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo-learn</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<name>demo-learn</name>
<description>Demo project for Spring Boot</description>
:
</project>
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>demo-learn</artifactId>
<version>0.0.1</version>
<relativePath>../</relativePath>
</parent>
<artifactId>parent</artifactId>
<packaging>jar</packaging>
<version>0.0.2</version>
<name>parent</name>
<description />
:
</project>
※各サブモジュールも、同様の構成。
問題点
各々のバージョンナンバーの不一致や、親子の依存関係などある場合、見ないといけない部分が多く
リリースのタイミングで気にすることが多く発生してたのが、モヤモヤしてた部分です。
解決策
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo-learn</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<name>demo-learn</name>
<description>Demo project for Spring Boot</description>
:
</project>
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>demo-learn</artifactId>
<version>0.0.1</version>
<relativePath>../</relativePath>
</parent>
<artifactId>parent</artifactId>
<packaging>jar</packaging>
<name>parent</name>
<description />
:
</project>
個別に管理してたバージョンを親で一括管理して、各moduleのバージョンもリリースタイミングで一斉にあげる方針に切り替えました。
依存関係を考慮すると、個別で管理する意味が無いなと感じたところが大きいところです。
結果、各々の pom.xml から <version>
タグを削除し、親pomのバージョンナンバーを踏襲するようにしました。
各々の pom.xml 内の <parent>/<version>
は修正の度に気にする必要がありますが
だいぶ、修正コストは下げれた形になりました。
おまけ
sub-module 間で依存関係がある場合は、以下を適応しておくと更に依存部分のバージョンを気にしなくて良くなるので便利。
親pomの編集だけで済む形になります。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
</dependency>
</dependencies>
参考
https://books.sonatype.com/mvnex-book/reference/multimodule.html
https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html