LoginSignup
2
1

More than 5 years have passed since last update.

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

Posted at

概要

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1