はじめに
どうも@chan_kakuです
今回はSpringBoot1.5系が今年の8月でEOLになってしまうということでその対応をしてみて、苦労した点などを述べていきたいと思います。
SpringBootについて
SpringBootとはSpringフレームワークをベースとしたアプリケーションを簡単に作成することができるフレームワークのことです。
詳しくは公式ドキュメントをみてください。
行なったこと(概要)
- Gradle3系 → Gradle5系
- SpringBoot1.5系 → SpringBoot2.1系
- その他依存ライブラリのバージョンアップ
Gradle3系 → Gradle5系
SpringBoot2系にあげるにはまず、Gradleのバージョンを4.4以上にあげないといけなかったため、こちらから取り組みました
今回対象となったプロジェクトはGradleWrapperを利用していたので、以下のように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系が使えるようになったので、ここでバージョンをあげていきます
基本的なことはこちらのSpringBootのGithubWikiに記載されていますのでご覧になってください
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なども以下のように記載していました。
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
しかしながらGradle5系からは書き方が変更になり以下のようにブロックとして書くことが推奨されるようになりました。
plugins {
id 'org.springframework.boot' version '2.1.4.RELEASE'
id 'java'
}
dependenciesの書き方
dependenciesの書き方も大きく変更されました。
Gradle3系までの書き方はこのような書き方となってました。
compile('org.springframework.boot:spring-boot-starter')
compile('org.springframework.boot:spring-boot-starter-web')
//.....などなど
基本的に依存ライブラリはcompileで書いていました。
しかしながら、Gradle5系ではimplementation
と言う書き方が増えており、compile
はdeprecatedになってました
compile
とimplementation
の違いとしては、簡単に言うと、依存関係の伝搬の範囲です。
したがって、以下のようにcompile
と書かれていた部分を一旦implementation
に置き換えていきました
implementaion('org.springframework.boot:spring-boot-starter')
implementaion('org.springframework.boot:spring-boot-starter-web')
//.....などなど
jar周りの書き方
こちらも少しだけ変更されていました。公式ドキュメント
今まではこのように書いていました
jar {
baseName = "hoge"
archiveName = "${baseName}.jar"
version = "1.0.0-SNAPSHOT"
}
このうちbaseName
とarchiveName
がdeprecatedになっていたため、Documentにしたがって以下のように修正しました
jar {
archiveBaseName = "hoge"
archiveFileName = "${archiveBaseName}.jar"
version = "1.0.0-SNAPSHOT"
}
baseName
がarchiveBaseName
へ
archiveName
がarchiveFileName
へ変更されたようです
これ以外にもappendix
なども変更されていますので、ぜひDocumentをご覧ください!!
その他苦労した点など
doma2について
今回バージョンアップしたプロジェクトのDBアクセスにはdoma2を利用していました
元々のdependenciesには以下のように書いていました。
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登録に関しては上手くいきました!
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
はGradle5系から追加されたもので、追加しなくてはいけなくなった理由としては、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/