SpringBoot1.5系を2.1系にあげた話

# はじめに
どうも@chan_kakuです
今回はSpringBoot1.5系が今年の8月でEOLになってしまうということでその対応をしてみて、苦労した点などを述べていきたいと思います。

## SpringBootについて
SpringBootとはSpringフレームワークをベースとしたアプリケーションを簡単に作成することができるフレームワークのことです。
詳しくは[公式ドキュメント](https://spring.io/projects/spring-boot)をみてください。

## 行なったこと(概要)
- Gradle3系 → Gradle5系
- SpringBoot1.5系 → SpringBoot2.1系
- その他依存ライブラリのバージョンアップ

### Gradle3系 →　Gradle5系
SpringBoot2系にあげるにはまず、Gradleのバージョンを4.4以上にあげないといけなかったため、こちらから取り組みました
今回対象となったプロジェクトはGradleWrapperを利用していたので、以下のようにgradle-wrapper.propertiesを修正しました

```gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip #ここのバージョンを変更しました
```


### SpringBoot1.5系 → SpringBoot2.1系
上記の対応でようやくSpringBoot2系が使えるようになったので、ここでバージョンをあげていきます
基本的なことは[こちら](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide)のSpringBootのGithubWikiに記載されていますのでご覧になってください

```build.gradle
plugins {
	id 'org.springframework.boot' version '2.1.4.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
```

#### 変更点
boot1.5系ではありませんでしたが、Documentによると`io.spring.dependency-management`を追加しないといけなくなったようです

##### pluginsの書き方
Gradle3系ではJavaやSpringBootなども以下のように記載していました。

```build.gradle
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
```


しかしながらGradle5系からは書き方が変更になり以下のようにブロックとして書くことが推奨されるようになりました。

```build.gradle
plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'java'
}
```

##### dependenciesの書き方
dependenciesの書き方も大きく変更されました。
Gradle3系までの書き方はこのような書き方となってました。

```build.gradle
compile('org.springframework.boot:spring-boot-starter')
compile('org.springframework.boot:spring-boot-starter-web')
//.....などなど
```

基本的に依存ライブラリはcompileで書いていました。
しかしながら、Gradle５系では`implementation`と言う書き方が増えており、`compile`はdeprecatedになってました
`compile`と`implementation`の違いとしては、簡単に言うと、依存関係の伝搬の範囲です。
したがって、以下のように`compile`と書かれていた部分を一旦`implementation`に置き換えていきました

```build.gradle
implementaion('org.springframework.boot:spring-boot-starter')
implementaion('org.springframework.boot:spring-boot-starter-web')
//.....などなど
```

##### jar周りの書き方
こちらも少しだけ変更されていました。[公式ドキュメント](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html)

今まではこのように書いていました

``` build.gradle
jar {
	baseName = "hoge"
	archiveName = "${baseName}.jar"
	version = "1.0.0-SNAPSHOT"
}
```

このうち`baseName`と`archiveName`がdeprecatedになっていたため、Documentにしたがって以下のように修正しました

```build.gradle
jar {
    archiveBaseName = "hoge"
    archiveFileName = "${archiveBaseName}.jar"
    version = "1.0.0-SNAPSHOT"
}
```

`baseName`が`archiveBaseName`へ
`archiveName`が`archiveFileName`へ変更されたようです
これ以外にも`appendix`なども変更されていますので、ぜひDocumentをご覧ください！！

### その他苦労した点など
#### doma2について
今回バージョンアップしたプロジェクトのDBアクセスにはdoma2を利用していました
元々のdependenciesには以下のように書いていました。

```build.gradle
compile('org.seasar.doma.boot:doma-spring-boot-starter:1.1.0')
```

上記のdependenciesの書き方にもあるように単純に`compile`を`implementation`に置き換えて行ったところ思わぬところではまってしまいました
DIしているクラスでDaoのBeanが登録されていないのでDIできないよーと言うようなエラーが出ていました
しばらくは原因がつかめませんでしたが、一旦doma2のDocumentをみてみたところ元々のbuild.gradleとの差があったので、
以下のように変更したところDaoのBean登録に関しては上手くいきました！

```build.gradle
implementation('org.seasar.doma.boot:doma-spring-boot-starter:1.1.1')
implementation("org.seasar.doma:doma:2.24.0")
annotationProcessor("org.seasar.doma:doma:2.24.0")
```

今までは一番上の`doma-spring-boot-starter`だけで動いていたのですが、'doma'自体をimplemetaionで追加しないといけなくなったのと、
`annotationProcessor`を使って`doma`を入れないといけなくなったみたいでした
この`annotationProcessor`はGradle５系から追加されたもので、追加しなくてはいけなくなった理由としては、Gradle 5系からはアノテーションプロセッサをコンパイル時のクラスパスから取得する方法がサポートされなくなるらしいからです。
したがって、domaだけではなく今までアノテーションプロセッサをクラスパスから取得していたようなライブラリを利用している場合はこのように`annotationProcessor`を追加しなくてはならなくなりました。

#### jacksonについて
jackson(ジャクソン)とは、JSON形式のデータを処理するためのJavaライブラリで、今回の対象のプロジェクトで使われていました。
こちらも例のごとく`compile`を単純に`implementaion`に置き換えたところdoma2の時と同じようにjacksonライブラリ内のBean登録あたりエラーが出ていました。
こちらはバージョンを最新にすることで解決することができました。

## 最後に
今回はこのマイグレーションがどれくらい難しいのか測るために出来るだけ依存ライブラリの少ないプロジェクトを対象に行なってみました。
しかしながらおもっていたよりハマりどころが多く、個人的には難しい印象でした。
1.5系のEOLが今年の8月と言うことなので、出来るだけ早めに動かれることをおすすめします！
この記事が皆さんの参考になれば幸いです。

## 参考にしたサイト
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
https://qiita.com/yukina-ge/items/1ca029ed69494bfd36d6
https://qiita.com/opengl-8080/items/6ad642e0b016465891de
https://doma.readthedocs.io/en/2.19.2/build/