こんばんわ、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.gradle
でleftshit()(省略形:<<)を使ってましたでエラーが起きます。
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}")
}
springBootVersion
を2.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周りの話を書けたらと思います!
コメント