かんがるーさんの日記

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

Spring Boot 1.4.x の Web アプリを 1.5.x へバージョンアップする ( その7 )( Gradle を 2.13 → 3.5 へバージョンアップし、FindBugs Gradle Plugin が出力する大量のログを抑制する )

概要

記事一覧はこちらです。

Spring Boot 1.4.x の Web アプリを 1.5.x へバージョンアップする ( その6 )( Thymeleaf を 2.1.5 → 3.0.6 へバージョンアップする2 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Gradle を 2.13 → 3.5 へバージョンアップします。
    • Gradle 3.3 以降にすると FindBugs Gradle Plugin が大量のログを出力するようになるのでバージョンアップを止めていたのですが、出力しないようにする方法が見つかったので反映します。

参照したサイト・書籍

  1. Task cache enabled with findbugs causes the build to fail
    https://discuss.gradle.org/t/task-cache-enabled-with-findbugs-causes-the-build-to-fail/22572

目次

  1. Gradle を 2.13 → 3.5 へバージョンアップする
  2. Gradle 3.3 以降にすると FindBugs Gradle Plugin が大量にログを出力する現象を抑制する

手順

Gradle を 2.13 → 3.5 へバージョンアップする

  1. build.gradle を リンク先のその1の内容 に変更します。

  2. コマンドプロンプトを起動し、gradlew wrapper コマンドを実行します。

    f:id:ksby:20170530003517p:plain

    gradle/wrapper/gradle-wrapper.properties を開くと gradle-3.5-bin.zip に変更されています。

    f:id:ksby:20170530003710p:plain

  3. Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

  4. clean タスク実行 → Rebuild Project → build タスクを実行します。

    最後に “BUILD SUCCESSFUL” は出ますが、まだ FindBugs Gradle Plugin の大量ログ出力の対応を入れていないので、途中に Cannot open codebase filesystem:... のログが大量に出力されます。

    f:id:ksby:20170530005611p:plain f:id:ksby:20170530005738p:plain

Gradle 3.3 以降にすると FindBugs Gradle Plugin が大量にログを出力する現象を抑制する

  1. build.gradle を リンク先のその2の内容 に変更します。

  2. Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

  3. clean タスク実行 → Rebuild Project → build タスクを実行します。

    今回は Cannot open codebase filesystem:... のログが全く出力されません。

    f:id:ksby:20170530011531p:plain

    試しに Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その8 )( build.gradle への checkstyle, findbugs の導入+CheckStyle-IDEA, FindBugs-IDEA Plugin の導入 ) で修正した src/main/java/ksbysample/webapp/lending/web/booklist/RegisterBooklistForm.java を以下のように元に戻してから clean タスク実行 → Rebuild Project → build タスク を実行してみると、

    f:id:ksby:20170530013858p:plain

    • public static classpublic class に変更しています。

    FindBugs rule violations were found. のログが出力されており、

    f:id:ksby:20170530014340p:plain

    main.html を開くと static を付けるよう指摘されています。

    f:id:ksby:20170530014530p:plain

    問題なさそうですので、このまま 3.5 を使います。

ソースコード

build.gradle

■その1

task wrapper(type: Wrapper) {
    gradleVersion = '3.5'
}

..........

// 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}"
        }

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

        // 自動生成したファイルを git add する
        addGit()
    }
}

task downloadCssFontsJs {
    doLast {
        def staticDirPath = 'src/main/resources/static'
        def workDirPath = 'work'
        def adminLTEVersion = '2.2.0'
        def jQueryVersion = '2.1.4'
        def fontAwesomeVersion = '4.3.0'
        def ioniconsVersion = '2.0.1'
        def html5shivJsVersion = '3.7.2'
        def respondMinJsVersion = '1.4.2'

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

        // Bootstrap & AdminLTE Dashboard & Control Panel Template
        downloadAdminLTE("${adminLTEVersion}", "${jQueryVersion}", "${workDirPath}", "${staticDirPath}")

        // Font Awesome Icons
        downloadFontAwesome("${fontAwesomeVersion}", "${workDirPath}", "${staticDirPath}")

        // Ionicons
        downloadIonicons("${ioniconsVersion}", "${workDirPath}", "${staticDirPath}")

        // html5shiv.js
        downloadHtml5shivJs("${html5shivJsVersion}", "${workDirPath}", "${staticDirPath}")

        // respond.min.js
        downloadRespondMinJs("${respondMinJsVersion}", "${workDirPath}", "${staticDirPath}")

        // fileinput.min.js ( v4.2.7 )
        downloadBootstrapFileInputMinJs("${workDirPath}", "${staticDirPath}")

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

        // 追加したファイルを git add する
        addGit()
    }
}

task printClassWhatNotMakeTest {
    doLast {
        def srcDir = new File("src/main/java")
        def excludePaths = [
                "src/main/java/ksbysample/webapp/lending/Application.java"
                , "src/main/java/ksbysample/webapp/lending/config"
                , "src/main/java/ksbysample/webapp/lending/cookie"
                , "src/main/java/ksbysample/webapp/lending/dao"
                , "src/main/java/ksbysample/webapp/lending/entity"
                , "src/main/java/ksbysample/webapp/lending/exception"
                , "src/main/java/ksbysample/webapp/lending/helper/download/booklistcsv"
                , "src/main/java/ksbysample/webapp/lending/helper/download/DataDownloadHelper.java"
                , "src/main/java/ksbysample/webapp/lending/helper/page/PagenationHelper.java"
                , "src/main/java/ksbysample/webapp/lending/security/LendingUser.java"
                , "src/main/java/ksbysample/webapp/lending/security/RoleAwareAuthenticationSuccessHandler.java"
                , "src/main/java/ksbysample/webapp/lending/service/calilapi/response"
                , "src/main/java/ksbysample/webapp/lending/service/file/BooklistCSVRecord.java"
                , "src/main/java/ksbysample/webapp/lending/service/openweathermapapi"
                , "src/main/java/ksbysample/webapp/lending/service/queue/InquiringStatusOfBookQueueMessage.java"
                , "src/main/java/ksbysample/webapp/lending/util/doma"
                , "src/main/java/ksbysample/webapp/lending/util/velocity/VelocityUtils.java"
                , "src/main/java/ksbysample/webapp/lending/values/validation/ValuesEnum.java"
                , "src/main/java/ksbysample/webapp/lending/view/BookListCsvView.java"
                , "src/main/java/ksbysample/webapp/lending/web/.+/.+Service.java"
                , "src/main/java/ksbysample/webapp/lending/webapi/common/CommonWebApiResponse.java"
                , "src/main/java/ksbysample/webapp/lending/webapi/weather"
        ]
        def excludeFileNamePatterns = [
                ".*EventListener.java"
                , ".*Dto.java"
                , ".*Form.java"
                , ".*Values.java"
        ]

        compareSrcAndTestDir(srcDir, excludePaths, excludeFileNamePatterns)
    }
}

..........
  • gradleVersion = '2.13'gradleVersion = '3.5' に変更します。
  • domaGen, downloadCssFontsJs, printClassWhatNotMakeTest の書き方を task ... << { ... }task ... { doLast { ... } } に変更します。

■その2

tasks.withType(FindBugs) {
    // Gradle 3.3以降 + FindBugs Gradle Plugin を組み合わせると、"The following errors occurred during analysis:"
    // の後に "Cannot open codebase filesystem:..." というメッセージが大量に出力されるので、以下の doFirst { ... }
    // のコードを入れることで出力されないようにする
    doFirst {
        def fc = classes
        if (fc == null) {
            return
        }
        fc.exclude '**/*.properties'
        fc.exclude '**/*.xml'
        fc.exclude '**/META-INF/**'
        fc.exclude '**/static/**'
        fc.exclude '**/templates/**'
        classes = files(fc.files)
    }
    reports {
        xml.enabled = false
        html.enabled = true
    }
}
  • doFirst { ... } を追加します。これで FindBugs の Analysis の対象のファイルから Cannot open codebase filesystem:... のログが出力されるファイルを除外します。

履歴

2017/05/30
初版発行。