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 が大量のログを出力するようになるのでバージョンアップを止めていたのですが、出力しないようにする方法が見つかったので反映します。
参照したサイト・書籍
- 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
目次
手順
Gradle を 2.13 → 3.5 へバージョンアップする
build.gradle を リンク先のその1の内容 に変更します。
コマンドプロンプトを起動し、
gradlew wrapper
コマンドを実行します。gradle/wrapper/gradle-wrapper.properties を開くと gradle-3.5-bin.zip に変更されています。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project → build タスクを実行します。
最後に “BUILD SUCCESSFUL” は出ますが、まだ FindBugs Gradle Plugin の大量ログ出力の対応を入れていないので、途中に
Cannot open codebase filesystem:...
のログが大量に出力されます。
Gradle 3.3 以降にすると FindBugs Gradle Plugin が大量にログを出力する現象を抑制する
build.gradle を リンク先のその2の内容 に変更します。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project → build タスクを実行します。
今回は
Cannot open codebase filesystem:...
のログが全く出力されません。試しに 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 タスク を実行してみると、
public static class
→public class
に変更しています。
FindBugs rule violations were found.
のログが出力されており、main.html を開くと static を付けるよう指摘されています。
問題なさそうですので、このまま 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
初版発行。