かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

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 にバージョンアップします。

参照したサイト・書籍

目次

  1. 2.1.x ブランチの作成
  2. Gradle を 4.10.3 → 5.0 へバージョンアップする。。。が compileTestJava で lombok が適用されない
  3. Gradle を 5.0 → 5.2 へバージョンアップするも状況変わらず
  4. build.gradle に testAnnotationProcessor の定義を追加する
  5. lombok の設定で annotationProcessor, testAnnotationProcessor や compileOnly, testCompileOnly を併記しなくてもよいように build.gradle を変更する
  6. gradlew.bat の DEFAULT_JVM_OPTS の設定を変更する
  7. 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 を入力します。

f:id:ksby:20190206103840p:plain

Publishing build scan... のメッセージの下に URL が表示されますので、その URL にアクセスしてメールアドレスを入力します。

メールアドレスに「Your build scan for 'ksbysample-webapp-lending' from ...」という件名のメールが届きますので、その中の「Discover your build」ボタンをクリックして「Build Scan」画面を表示します。何か対応が必要な場合には画面左側の「Console log」の下に「Deprecations」が表示されるとのことですが、表示されませんでしたので次に進みます。

f:id:ksby:20190206104323p:plain

build.gradle の wrapper タスクの記述を以下のように変更します。

wrapper {
    gradleVersion = "5.0"
    distributionType = Wrapper.DistributionType.ALL
}
  • gradleVersion = "4.10.3"gradleVersion = "5.0" に変更します。

コマンドプロンプトから gradlew wrapper --gradle-version 5.0gradlew --version コマンドを実行します。

f:id:ksby:20190206110555p:plain

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" のメッセージが出力されました。

f:id:ksby:20190206112421p:plain f:id:ksby:20190206112523p:plain

コンパイルが失敗したのは src/test/java/ksbysample/test/ItemTypeStringToCodeConversion.java の下の赤枠の箇所ですが、どうも lombok の @Getter アノテーションが適用されていないようです。

f:id:ksby:20190206115551p:plain

原因がよく分からないので、一旦 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.2gradlew --version コマンドを実行します。

f:id:ksby:20190206130302p:plain

Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行して見ましたが状況が変わりませんでした。。。

build.gradle に testAnnotationProcessor の定義を追加する

Upgrading your build from Gradle 4.x to 5.0Upgrading 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アノテーションプロセッサが実行されていなかったのでしょう。

f:id:ksby:20190206155912p:plain

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" のメッセージが出力されました。

f:id:ksby:20190206161506p:plain

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" のメッセージが出力されました。

f:id:ksby:20190206164254p:plain

gradlew.bat の DEFAULT_JVM_OPTS の設定を変更する

Gradle をバージョンアップした際に変更されたファイルを確認したところ、gradlew.bat 内の DEFAULT_JVM_OPTS が以前は何も設定されていなかったのが -Xmx64m が設定されるようになっていました。

f:id:ksby:20190206212927p:plain

さすがに -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
初版発行。