Help us understand the problem. What is going on with this article?

マルチモジュールプロジェクトにて、バージョニングの管理コストを減らす

More than 1 year has passed since last update.

概要

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 で行なっていました。

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>
parent/pom.xml
<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>

※各サブモジュールも、同様の構成。

問題点

各々のバージョンナンバーの不一致や、親子の依存関係などある場合、見ないといけない部分が多く
リリースのタイミングで気にすることが多く発生してたのが、モヤモヤしてた部分です。

解決策

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>
parent/pom.xml
<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の編集だけで済む形になります。

pom.xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>parent</artifactId>
            <version>0.0.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>
web-app/pom.xml
<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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away