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

# 概要
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