Spring IO platform のススメ

# Spring IO platform のススメ

- [Spring IO platform](http://platform.spring.io/platform/)

個人的にすごく重宝しているけど、使っているプロジェクトをあまり見たことが無いので書いておこうかと思います。

## Spring IO platform のイイトコロ

### ライブラリ毎のバージョンに迷わない

ってかメジャーどころのライブラリならバージョン指定しなくて大丈夫です。

### ライブラリのバージョンアップが楽

Spring IO platform自体のバージョンを上げてしまうというのが一番手っ取り早いです。
こまめに上げておけば、Springやちゃんとしたライブラリなら互換性が無くなる前にdeprecatedで知らせてくれます。
警告が出た箇所で該当のJavadocを参照して、その通りに修正すれば良いのです。

ですが、バージョンアップ対象のライブラリのリリースノートやコミットログくらいは簡単に追っておきたいところです。

個別にバージョン上げたい場合は後述します。

### 組み合わせがテストされているという安心感

とは言っても、自分のプロジェクトでテストしているわけではないので、常日頃テストコードは書いておきましょう。
バージョンを上げても殆どバグは出ないですが、あっても必ず単体テストで見つかりました。

## 実際にやってみる

まずはこれまた重宝している[SPRING INITIALIZR](https://start.spring.io/)のサイトにアクセスします。

![スクリーンショット 2017-09-30 13.19.19.png](https://qiita-image-store.s3.amazonaws.com/0/66760/2ef0ca36-f66a-a635-cbe8-9273d0fdd149.png)


で、適当に埋めていきます。
自分はだいたいいつもこんな感じです。

![スクリーンショット 2017-09-30 13.23.09.png](https://qiita-image-store.s3.amazonaws.com/0/66760/8d65aa9d-4041-6065-83b3-0861b84dbf0f.png)


そして`Generate Project`！

ダウンロードされたZIPファイルを展開します。

```bash
$ unzip demo-spring-io-platform.zip
$ cd demo-spring-io-platform
```

展開したらpom.xmlを修正します。
ここです！ここ大事です！
Spring IO platformのトップページには

```xml:pom.xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.spring.platform</groupId>
            <artifactId>platform-bom</artifactId>
            <version>Brussels-SR5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
```

と書かれているのですが、リファレンス見るとオススメはこっちだと書かれているのです。

```xml:pom.xml
<parent>
    <groupId>io.spring.platform</groupId>
    <artifactId>platform-bom</artifactId>
    <version>Brussels-SR5</version>
    <relativePath/>
</parent>
```

えっ？そんなことしたら`spring-boot-starter-parent`を親に指定できないじゃんって思った方。安心してください。
`spring-boot-starter-parent`はおじいちゃんになってもらいます。

`platform-bom`の親pomは`spring-boot-starter-parent`になっているのです。
なので、心配は要りません。

`dependencyManagement`として設定するのと何が違うって、`platform-bom`が提供する各ライブラリの変更が簡単にできる点です。

例えば`guava`を追加してみます。

```xml:pom.xml
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>
```

バージョンは指定しません。`platform-bom`が提供してくれています。
この時点で`20.0`が適用されます。

「あぁ、guavaだけ最新版に上げたい〜」となった時に`guava`なのである程度テストは必要になりますが、こんな形でできます。

```diff:pom.xml
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>

+   <guava.version>23.0</guava.version>
</properties>
```

`dependency`の方にバージョン変数を設定しなくてOKです。`platform-bom`でやってくれています。
`dependencyManagement`に`platoform-bom`を設定していると、プロパティのバージョンが反映されません。

じゃあ、次は絶対にバージョンを上げる`assertj`です。
`assertj`は`spring-boot-parent`で2.x系のバージョンが指定されています。
Java8対応は3.x系なので、思い切ってバージョンを最新にします。依存度も少ないからこれは安心して上げられます。

```diff:pom.xml
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>

   <guava.version>23.0</guava.version>
+  <assertj.version>3.8.0</assertj.version>
</properties>
```

これだけです。既にimportされているライブラリなのでプロパティでバージョン指定だけすればOKです。

## まとめ

長く運用していると細かな調整は入ると思いますが、それでもバージョン関係で悩むことは他のチームに比べて殆ど無かったと思います。
良ければ皆さんも是非！