Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その2 )( Gradle を 4.10.3 → 5.2 にバージョンアップする )
概要
記事一覧はこちらです。
Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その1 )( 概要 ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- Gradle の 5 系がリリースされていますので、Gradle を 4.10.3 → 5.2 にバージョンアップします。
参照したサイト・書籍
Upgrading your build from Gradle 4.x to 5.0
https://docs.gradle.org/current/userguide/upgrading_version_4.htmlUpgrading your build from Gradle 5.x
https://docs.gradle.org/current/userguide/upgrading_version_5.html
目次
- 2.1.x ブランチの作成
- Gradle を 4.10.3 → 5.0 へバージョンアップする。。。が compileTestJava で lombok が適用されない
- Gradle を 5.0 → 5.2 へバージョンアップするも状況変わらず
- build.gradle に testAnnotationProcessor の定義を追加する
- lombok の設定で annotationProcessor, testAnnotationProcessor や compileOnly, testCompileOnly を併記しなくてもよいように build.gradle を変更する
- gradlew.bat の DEFAULT_JVM_OPTS の設定を変更する
- Gradle 5 の BOM import 機能に切り替えて io.spring.dependency-management plugin を削除しよう。。。と思ったが止める
手順
2.1.x ブランチの作成
master から 2.1.x ブランチを、2.1.x から feature/133-issue ブランチを作成します。
Gradle を 4.10.3 → 5.0 へバージョンアップする。。。が compileTestJava で lombok が適用されない
まずは Upgrading your build from Gradle 4.x to 5.0 に従い Gradle を 5.0 へバージョンアップします。
gradle help --scan
コマンドを実行します。Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]
のメッセージが表示されたら yes を入力します。
Publishing build scan...
のメッセージの下に URL が表示されますので、その URL にアクセスしてメールアドレスを入力します。
メールアドレスに「Your build scan for 'ksbysample-webapp-lending' from ...」という件名のメールが届きますので、その中の「Discover your build」ボタンをクリックして「Build Scan」画面を表示します。何か対応が必要な場合には画面左側の「Console log」の下に「Deprecations」が表示されるとのことですが、表示されませんでしたので次に進みます。
build.gradle の wrapper タスクの記述を以下のように変更します。
wrapper {
gradleVersion = "5.0"
distributionType = Wrapper.DistributionType.ALL
}
gradleVersion = "4.10.3"
→gradleVersion = "5.0"
に変更します。
コマンドプロンプトから gradlew wrapper --gradle-version 5.0
、gradlew --version
コマンドを実行します。
gradle/wrapper/gradle-wrapper.properties は以下の内容になります。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると test のコンパイルが失敗して "BUILD FAILED" のメッセージが出力されました。
コンパイルが失敗したのは src/test/java/ksbysample/test/ItemTypeStringToCodeConversion.java の下の赤枠の箇所ですが、どうも lombok の @Getter アノテーションが適用されていないようです。
原因がよく分からないので、一旦 gradle を 5.2 まで上げてみます。
Gradle を 5.0 → 5.2 へバージョンアップするも状況変わらず
build.gradle の wrapper タスクの記述を以下のように変更します。
wrapper {
gradleVersion = "5.2"
distributionType = Wrapper.DistributionType.ALL
}
gradleVersion = "5.0"
→gradleVersion = "5.2"
に変更します。
コマンドプロンプトから gradlew wrapper --gradle-version 5.2
、gradlew --version
コマンドを実行します。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行して見ましたが状況が変わりませんでした。。。
build.gradle に testAnnotationProcessor の定義を追加する
Upgrading your build from Gradle 4.x to 5.0、Upgrading your build from Gradle 5.x には解決しそうな記述は見当たらず Web で調べてもよく分からなかったのですが、build.gradle を見ていてふと気づいたことがありました。
今は build.gradle の dependencies block に lombok の設定を以下のように記述しているのですが、
// for lombok annotationProcessor("org.projectlombok:lombok:${lombokVersion}") compileOnly("org.projectlombok:lombok:${lombokVersion}") testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
compileOnly に testCompileOnly があるように、まさか annotationProcessor にも testAnnotationProcessor があるのかな。。。と思って入力してみたところ、ありました! ということは testAnnotationProcessor の記述がないので compileTestjava タスクで lombok のアノテーションプロセッサが実行されていなかったのでしょう。
build.gradle に testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")
を追加してから、
// for lombok annotationProcessor("org.projectlombok:lombok:${lombokVersion}") testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}") compileOnly("org.projectlombok:lombok:${lombokVersion}") testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。
lombok の設定で annotationProcessor, testAnnotationProcessor や compileOnly, testCompileOnly を併記しなくてもよいように build.gradle を変更する
もう少し調べてみたところ compileOnly dependencies are not available in tests を見つけました。build.gradle の configurations block に testImplementation.extendsFrom compileOnly
を記述しておくと compileOnly と testCompileOnly を併記しなくても良くなるようです。
build.gradle を以下のように変更します。
configurations { // annotationProcessor と testAnnotationProcessor、compileOnly と testCompileOnly を併記不要にする testAnnotationProcessor.extendsFrom annotationProcessor testImplementation.extendsFrom compileOnly // for Doma 2 domaGenRuntime } .......... dependencies { .......... // for lombok // testAnnotationProcessor、testCompileOnly を併記しなくてよいよう configurations で設定している annotationProcessor("org.projectlombok:lombok:${lombokVersion}") compileOnly("org.projectlombok:lombok:${lombokVersion}")
- configurations block に以下の2行を追加します。
testImplementation.extendsFrom compileOnly
testAnnotationProcessor.extendsFrom annotationProcessor
- dependencies block の lombok の設定から以下の2行を削除します。
testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")
testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。
gradlew.bat の DEFAULT_JVM_OPTS の設定を変更する
Gradle をバージョンアップした際に変更されたファイルを確認したところ、gradlew.bat 内の DEFAULT_JVM_OPTS
が以前は何も設定されていなかったのが -Xmx64m
が設定されるようになっていました。
さすがに -Xmx64m
は小さいので set DEFAULT_JVM_OPTS="-Xmx64m"
→ set DEFAULT_JVM_OPTS="-Xmx4096m"
に変更します。
Gradle 5 の BOM import 機能に切り替えて io.spring.dependency-management plugin を削除しよう。。。と思ったが止める
Gradle 5 から io.spring.dependency-management plugin を使用しなくても BOM を直接参照できるようになりました。BOM import に記述があります。Gradle 5 の機能に切り替えてみます。
build.gradle を以下のように変更します。
plugins { id "java" id "eclipse" id "idea" id "org.springframework.boot" version "2.0.8.RELEASE" id "groovy" id "checkstyle" id "com.github.spotbugs" version "1.6.8" id "pmd" id "net.ltgt.errorprone" version "0.0.16" id "de.undercouch.download" version "3.4.3" id "com.gorylenko.gradle-git-properties" version "2.0.0-beta1" } .......... dependencies { def jdbcDriver = "org.postgresql:postgresql:42.2.5" def spockVersion = "1.2-groovy-2.5" def domaVersion = "2.21.0" def lombokVersion = "1.18.4" def errorproneVersion = "2.3.1" def powermockVersion = "2.0.0" def spotbugsVersion = "3.1.10" // BOM // https://repo.spring.io/release/org/springframework/boot/spring-boot-dependencies/2.0.8.RELEASE/spring-boot-dependencies-2.0.8.RELEASE.pom implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) // BOM によりバージョン番号が自動で設定されるもの // Appendix F. Dependency versions ( https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-dependency-versions.html ) 参照 implementation("org.springframework.boot:spring-boot-starter-web") .......... // BOM によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの .......... testImplementation("cglib:cglib-nodep:3.2.10") testImplementation("org.codehaus.groovy:groovy-all:2.5.4") testImplementation("org.spockframework:spock-core:${spockVersion}") ..........
- plugins block から
id "io.spring.dependency-management" version "1.0.6.RELEASE"
を削除します。 - dependencies block の上に記述していた dependencyManagement block を削除します。
- dependencies block の以下の点を変更します。
implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
を追加します。implementation platform(...)
の方法ではbomProperty "groovy.version", "2.5.4"
やext["groovy.version"] = "2.5.4"
を記述することで BOM 内の property の値を変更することができないので、testImplementation("org.codehaus.groovy:groovy-all:2.5.4")
を追加して groovy 及び関連ライブラリのバージョンを 2.5.4 にします。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。io.spring.dependency-management plugin の時と gradlew dependencies
コマンドの実行結果を比較してみたところ、主に以下の点が異なっていました。
- 以前は
org.slf4j:slf4j-api
のバージョンが1.8.0-beta2 -> 1.7.25
にダウングレードされていたのですが、今度は1.8.0-beta2
になっていました。 - compileClasspath、default、runtimeClasspath 等に
org.springframework.boot:spring-boot-dependencies:2.0.8.RELEASE
と依存しているライブラリが追加されていました。 - implementation に
org.springframework.boot:spring-boot-dependencies:2.0.8.RELEASE
が追加されていました(依存しているライブラリはなし)。 org.apache.tomcat.embed:tomcat-embed-core:8.5.37
の依存関係にorg.apache.tomcat:tomcat-annotations-api:8.5.37
が表示されるようになりました。org.thymeleaf:thymeleaf:3.0.11.RELEASE
の依存関係に以下の2つのライブラリが表示されるようになりました。ognl:ognl:3.1.12
org.javassist:javassist:3.20.0-GA -> 3.22.0-GA
- compileOnly に
org.springframework.boot:spring-boot-configuration-processor
が表示されるのですが、以前はorg.springframework.boot:spring-boot-configuration-processor -> 2.0.8.RELEASE
と表示されていたのですがorg.springframework.boot:spring-boot-configuration-processor FAILED
と表示されるようになりました。
thymeleaf の依存関係に ognl が出てくるのと org.springframework.boot:spring-boot-configuration-processor のバージョンが解決出来ず FAILED になるのが気になります。今回は io.spring.dependency-management plugin を使う方式に戻します。
履歴
2019/02/07
初版発行。