Help us understand the problem. What is going on with this article?

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

はじめに

どうも@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を修正しました

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に記載されていますのでご覧になってください

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で書いていました。
しかしながら、Gradle5系ではimplementationと言う書き方が増えており、compileはdeprecatedになってました
compileimplementationの違いとしては、簡単に言うと、依存関係の伝搬の範囲です。
したがって、以下のようにcompileと書かれていた部分を一旦implementationに置き換えていきました

build.gradle
implementaion('org.springframework.boot:spring-boot-starter')
implementaion('org.springframework.boot:spring-boot-starter-web')
//.....などなど
jar周りの書き方

こちらも少しだけ変更されていました。公式ドキュメント

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

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

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

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

baseNamearchiveBaseName
archiveNamearchiveFileNameへ変更されたようです
これ以外にもappendixなども変更されていますので、ぜひDocumentをご覧ください!!

その他苦労した点など

doma2について

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

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

上記のdependenciesの書き方にもあるように単純にcompileimplementationに置き換えて行ったところ思わぬところではまってしまいました
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は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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした