SpringBootを2.0.3から2.2.1にUpdateしました

技術ネタ
この記事は約10分で読めます。

こんばんわ、hisayukiです。

現在、Angularに続き負債返済期間真っ最中です。
そのなかでSpringBootのバージョンを上げる事になったので、やり方残しておきます。

スポンサーリンク

修正たくさん

当然ながら、ただ上げたらOKなんて行くわけないですね。
依存関係のあるところから徐々に変更しつつ、都度自動テスト流して通ったらcommitを繰り返していきます。

これが意外と時間かかりますが、品質担保のこと考えたら必須です。

ここからは何をやったか書いていきます。

Gradleのバージョンアップ

まずはGradle。
GradleはWrapperを使っているので、gradle-wrapper.propertiesを修正します。

gradle-wrapper.properties
#Sun Nov 24 11:44:35 JST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-all.zip

一番下の行のdistributionUrlの末尾をgradle-5.6.4-all.zipを変更します。

gradle-wrapper.properties
#Sun Nov 24 11:44:35 JST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

これで次回./gradlewを動かした時に自動で拾ってきてくれます。

本来ならこれで終わりなんですが、

今回使うJava13が5.6.4で対応してないので結局6.0.1にしました。

gradle-wrapper.properties
#Sun Nov 24 11:44:35 JST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip

最終的にはこうなりました。

Gradleを上げたことで動かなったのが次

leftshift()が使えなくなる

今までbuild.gradleleftshit()(省略形:<<)を使ってましたでエラーが起きます。

build.gradle
task loadTestData << {
 ~
}

こんな感じで使ってたのですが、leftshit()使えなくなりました。
どうやら消えたようで、代わりにdoListを使えということでした。

build.gradle
task loadTestData doList {
~
}

こんな感じに修正して、無事にエラーもなくなりました。

Javaのバージョンアップ

これは今稼働させてDockerコンテナごと取り替えました。

Dockerfile
FROM openjdk:13-jdk-alpine3.10
ENV TZ='Asia/Tokyo'
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

イメージをopenjdk:8-jdk-alpineからopenjdk:13-jdk-alpine3.10に変更します。

Javaのバージョンアップに伴う弊害

Java9くらいからprivate化されて参照できなくなったクラスがあるらしい。

今回はこのWARNINGを無視する方向ですすめるように設定します。

console
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/root/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/2.5.8/2f1e8ea55e625fe51e85ef35eb067f1d9c61772d/groovy-2.5.8.jar) to method java.lang.reflect.AnnotatedElement.lambda$getDeclaredAnnotationsByType$0(java.lang.annotation.Annotation,java.lang.annotation.Annotation)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

詳しく調べてないですが、パット見java.lang.annotation.Annotationクラスっぽいですね。
一応ネットで調べた対応だとJAVA_TOOL_OPTIONS–add-opensで以下のように追加すればいいみたいです。

console
JAVA_TOOL_OPTIONS="-Xmx1024m --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED"

invokeもする必要あるのかは要検証ですが、今回はこれでテスト通ったので一旦OKとします。

Kotlinのバージョンアップ

KotlinについてはGradle側で入れてるので、build.gradleを変更します。

build.gradle
kotlinVersion = '1.3.50'
springBootVersion = '2.0.3.RELEASE'

dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
    classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}")
}

kotlinVersionが今までは1.3.0でしたが1.3.50に変更しました。

SpringBootのバージョンアップ

ここまで来て、ようやくSpringBootのバージョンを上げます。

build.gradle
kotlinVersion = '1.3.50'
springBootVersion = '2.2.1.RELEASE'

dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
    classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}")
}

springBootVersion2.0.3.RELEASEから2.2.1.RELEASEに変更します。

logの修正

SpringBootを変更してすぐエラーで引っかかったのがコレでした。
logingの設定でlogging.level.org.springframework.webの設定が必要でした。

application.yml
logging:
  level:
    root: info
    org.springframework.web: debug
    org.hibernate.type.descriptor.sql.BesicBinder: info

hibernate側は元々してたのですが、こっちも必須になったのかな?
テスト用のapplication.ymlに設定したら通ったので、今の段階ではテスト用のみで。

Flywayのバージョンアップ

追記:

Flywayのバージョンアップを忘れてて、テスト環境で止まってました・・・(;´∀`)
今回5.1.4から6.1.0に上げます。

build.gradle
plugins {
    id "org.flywaydb.flyway" version "6.1.0"
}

dependencies {
    implementation 'org.flywaydb:flyway-core:6.1.0'
}

pluginsとdependenciesの2箇所変更ポイントがあります!
最初、pluginsだけ変更して少しハマりました・・・

Ktlintの変更

ktlintについては今までcom.github.shyiko:ktlintの0.22.0を使ってました。
こちらもバージョンを上げたのですが、GithubのURLが変わってました。

新しいURLはcom.pinterest:ktlintでバージョンは0.35.0を採用。

build.gradle
dependencies {
    ktlint "com.pinterest:ktlint:0.35.0"
}

task ktlint(type: JavaExec, group: "verification") {
    description = "Check Kotlin code style."
    main = "com.pinterest.ktlint.Main"
    classpath = configurations.ktlint
    args "src/**/*.kt"
}
check.dependsOn ktlint

task ktlintFormat(type: JavaExec, group: "formatting") {
    description = "Fix Kotlin code style deviations."
    main = "com.pinterest.ktlint.Main"
    classpath = configurations.ktlint
    args "-F", "src/**/*.kt"
}

バージョンを上げるのはそんなに難しくないですが・・・

今まで引っかからなかったところがめっちゃ引っかかりました。

100行超えてくる修正箇所見て、少し目をそらしたくなりました・・・

追記:

importをアルファベット順に並べろというlintとか、本当に必要?って思ったので外しました。
ktlintは.editorconfigというファイルをrootに配置することで、除外ルールを設定できます。

.editorconfig
[*.{kt,kts}]
disabled_rules=import-ordering

import-orderingというルールを除外することで、import文をアルファベット順にしろというlintは外せます。

まとめ

一応、ここまでで無事にアップデート完了です。

ただJavaのバージョンアップによる弊害は、少し詰めないとかなぁと。
WARNINGだけ見ると、java.langだけでもいいような気がするので。
それに環境変数に入れないといけないなら、Dockerfile側に設定しちゃえばいいなとも思いました。

次回はDockerfile周りの話を書けたらと思います!

コメント