かんがるーさんの日記

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

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その3 )( Gradle を 5.6.4 → 6.0.1 へバージョンアップする )

概要

記事一覧はこちらです。

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その2 )( Spring Boot を 2.1.4 → 2.1.11 へ、Gradle を 5.3.1 → 5.6.4 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Gradle を 5.6.4 → 6.0.1 へバージョンアップします。

参照したサイト・書籍

  1. Gradle 6.0 - Gradle Release Notes
    https://docs.gradle.org/6.0/release-notes.html

  2. Gradle 6.0.1 - Gradle Release Notes
    https://docs.gradle.org/6.0.1/release-notes.html

  3. Upgrading your build from Gradle 5.x to 6.0
    https://docs.gradle.org/current/userguide/upgrading_version_5.html

  4. gradle plugin doesn't seem to prefix jars by group ID on conflict
    https://github.com/spring-projects/spring-boot/issues/10778

目次

  1. Gradle を 5.6.4 → 6.0.1 にバージョンアップする
  2. Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. の原因を調査する
  3. 他に build.gradle で変更した方がよい箇所を変更する

手順

Gradle を 5.6.4 → 6.0.1 にバージョンアップする

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

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

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

f:id:ksby:20191230213330p:plain

gradle/wrapper/gradle-wrapper.properties は以下の内容になります。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

JVM を呼び出す時のメモリ割り当ての記述が元に戻るので、gradlew.bat 内の記述を set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"set DEFAULT_JVM_OPTS="-Xmx4096m" に変更します(gradlew も同じような変更をします)。

Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、Could not create task ':spotbugsTest'.Could not create task ':spotbugsMain'. のエラーが出ました。

一旦 SpotBugs をコメントアウトします。build.gradle を以下のように変更します。

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.1.11.RELEASE"
    id "io.spring.dependency-management" version "1.0.8.RELEASE"
    id "groovy"
    id "checkstyle"
//    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
    id "net.ltgt.errorprone" version "0.7.1"
    id "de.undercouch.download" version "3.4.3"
    id "com.gorylenko.gradle-git-properties" version "2.0.0"
}

..........

//spotbugs {
//    toolVersion = "3.1.11"
//    ignoreFailures = true
//    effort = "max"
//    spotbugsTest.enabled = false
//}
//tasks.withType(com.github.spotbugs.SpotBugsTask) {
//    reports {
//        xml.enabled = false
//        html.enabled = true
//    }
//}

..........

dependencies {
    def jdbcDriver = "org.postgresql:postgresql:42.2.5"
    def spockVersion = "1.3-groovy-2.5"
    def domaVersion = "2.24.0"
    def lombokVersion = "1.18.6"
    def errorproneVersion = "2.3.3"
    def powermockVersion = "2.0.0"
//    def spotbugsVersion = "3.1.11"

    ..........

    // for SpotBugs
//    compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}")
//    compileOnly("net.jcip:jcip-annotations:1.0")
//    compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugsVersion}")
//    testImplementation("com.google.code.findbugs:jsr305:3.0.2")
}

再び Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、今度は正常に終了しました(少し時間がかかります)。

clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。

f:id:ksby:20191230220309p:plain

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. の原因を調査する

build タスク実行時に以下のメッセージが出ていました。このメッセージが出ている原因を調べてみます。

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings を見ると gradlew build --warning-mode=all コマンドを実行すればメッセージが表示される原因が表示されるようです。

実行してみたところ、以下のメッセージが出力されました。

  • he testCompile configuration has been deprecated for dependency declaration. This will fail with an error in Gradle 7.0. Please use the testImplementation configuration instead.
    • testCompile で記述しているところが残っていたので testImplementation に変更します。Gradle 7.0 から古い記述は使用できなくなるようです。
  • The testRuntime configuration has been deprecated for dependency declaration. This will fail with an error in Gradle 7.0. Please use the testRuntimeOnly configuration instead.
    • testRuntime で記述しているところが残っていたので testRuntimeOnly に変更します。
  • The baseName property has been deprecated. This is scheduled to be removed in Gradle 7.0. Please use the archiveBaseName property instead.
    • build.gradle に baseName の記述はないので、おそらく Plugin でしょう。現時点では無視します。
  • Property 'options.compilerArgumentProviders.errorprone$0.name' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    • errorprone なので現時点では無視します。
  • Property 'gitProperties' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    • build.gradle に baseName の記述はないので、おそらく Plugin でしょう。現時点では無視します。
    • com.gorylenko.gradle-git-properties が原因か?と思って 2.0.0 → 2.2.0 へバージョンアップしてみましたが、メッセージは消えませんでした。
  • Property 'source' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    • build.gradle に source の記述はないので、おそらく Plugin でしょう。現時点では無視します。
  • Copying or archiving duplicate paths with the default duplicates strategy has been deprecated. This is scheduled to be removed in Gradle 7.0. Duplicate path: "BOOT-INF/classes/META-INF/ksbysample/webapp/lending/dao/LendingAppDao/selectById.sql". Explicitly set the duplicates strategy to 'DuplicatesStrategy.INCLUDE' if you want to allow duplicate paths.
    • bootJar { rootSpec.duplicatesStrategy = DuplicatesStrategy.INCLUDE } の記述を追加すれば上のメッセージは出力されなくなりますが、おそらく Gradle 7.0 が正式リリースされるまでに Spring Boot の Plugin あたりで対応されると思うので現時点では無視します。

build.gradle の以下の点を変更します。

dependencies {
    ..........

    // for JUnit 5
    // junit-jupiter で junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine の3つが依存関係に追加される
    testImplementation("org.junit.jupiter:junit-jupiter")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")

    ..........
}
  • dependencies block の以下の点を変更します。
    • testCompile("org.junit.jupiter:junit-jupiter")testImplementation("org.junit.jupiter:junit-jupiter")
    • testRuntime("org.junit.platform:junit-platform-launcher")testRuntimeOnly("org.junit.platform:junit-platform-launcher")

他に build.gradle で変更した方がよい箇所を変更する

buildscript {
    ext {
        group "ksbysample"
        version "2.1.11-RELEASE"
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/release/" }
        gradlePluginPortal()
    }
}

plugins {
    id "java"
    id "eclipse"
    id "idea"
    id "org.springframework.boot" version "2.1.11.RELEASE"
    id "io.spring.dependency-management" version "1.0.8.RELEASE"
    id "groovy"
    id "checkstyle"
//    id "com.github.spotbugs" version "1.6.9"
    id "pmd"
    id "net.ltgt.errorprone" version "0.7.1"
    id "com.gorylenko.gradle-git-properties" version "2.0.0"
}

..........

// for Doma-Gen
task domaGen {
    doLast {
        // まず変更が必要なもの
        def rootPackageName = "ksbysample.webapp.lending"
        def daoPackagePath = "src/main/java/ksbysample/webapp/lending/dao"
        def dbUrl = "jdbc:postgresql://localhost/ksbylending"
        def dbUser = "ksbylending_user"
        def dbPassword = "xxxxxxxx"
        def tableNamePattern = ".*"
        // おそらく変更不要なもの
        def importOfComponentAndAutowiredDomaConfig = "${rootPackageName}.util.doma.ComponentAndAutowiredDomaConfig"
        def workDirPath = "work"
        def workDaoDirPath = "${workDirPath}/dao"

        // 作業用ディレクトリを削除する
        clearDir("${workDirPath}")

        // 現在の Dao インターフェースのバックアップを取得する
        copy() {
            from "${daoPackagePath}"
            into "${workDaoDirPath}/org"
        }

        // Dao インターフェース、Entity クラスを生成する
        ant.taskdef(resource: "domagentask.properties",
                classpath: configurations.domaGenRuntime.asPath)
        ant.gen(url: "${dbUrl}", user: "${dbUser}", password: "${dbPassword}", tableNamePattern: "${tableNamePattern}") {
            entityConfig(packageName: "${rootPackageName}.entity", useListener: false)
            daoConfig(packageName: "${rootPackageName}.dao")
            sqlConfig()
        }

        // 生成された Dao インターフェースを作業用ディレクトリにコピーし、
        // @ComponentAndAutowiredDomaConfig アノテーションを付加する
        copy() {
            from "${daoPackagePath}"
            into "${workDaoDirPath}/replace"
            filter {
                line ->
                    line.replaceAll("import org.seasar.doma.Dao;", "import ${importOfComponentAndAutowiredDomaConfig};\nimport org.seasar.doma.Dao;")
                            .replaceAll("@Dao", "@Dao\n@ComponentAndAutowiredDomaConfig")
            }
        }

        // @ComponentAndAutowiredDomaConfig アノテーションを付加した Dao インターフェースを
        // dao パッケージへ戻す
        copy() {
            from "${workDaoDirPath}/replace"
            into "${daoPackagePath}"
        }

        // 元々 dao パッケージ内にあったファイルを元に戻す
        copy() {
            from "${workDaoDirPath}/org"
            into "${daoPackagePath}"
        }

        // 作業用ディレクトリを削除する
        delete "${workDirPath}"
    }
}
  • buildscript block の以下の点を変更します。
    • maven { url "https://plugins.gradle.org/m2/" }gradlePluginPortal()
  • Gradle 7.0 から大きく仕様が変わるようなので build.gradle から不要になった記述を削除します。
    • 「メソッド定義部」の下に記述している関数の内、compareSrcAndTestDir 以外は削除します。
    • domaGen タスクの以下の点を変更します。
      • clearDir("${workDirPath}")delete "${workDirPath}" に変更します。
      • addGit() を削除します。
    • downloadCssFontsJs タスクを削除します。
    • plugins block から id "de.undercouch.download" version "3.4.3" を削除します。

Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。

f:id:ksby:20191231085410p:plain

履歴

2019/12/31
初版発行。