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 compileOnlytestAnnotationProcessor.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.12org.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
初版発行。