かんがるーさんの日記

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

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その11 )( Error Prone を 2.0.15 → 2.0.18 へバージョンアップ。。。できませんでした )

概要

記事一覧はこちらです。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その10 )( インジェクションの方法を @Autowired によるフィールドインジェクション → コンストラクタインジェクションへ変更する ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Error Prone を 2.0.15 → 2.0.18 へバージョンアップします。
    • gradle-errorprone-plugin も 0.0.8 → 0.0.9 へバージョンアップします。
    • 。。。と思いましたが、Error Prone の 2.0.15 → 2.0.18 へのバージョンアップはできなかったというお話です。

参照したサイト・書籍

目次

  1. build.gradle を変更する
  2. clean タスク → Rebuild Project → build タスクを実行する
  3. java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V の原因は?
  4. build.gradle の resolutionStrategy.force で Guava の 21.0 を強制してみる
  5. なぜ Guava のバージョンが 17.0 にバージョンダウンされるのか?
  6. BOM で指定されているライブラリのバージョンを変更する
  7. java.lang.ClassCastException: lombok.javac.apt.Javac7BaseFileObjectWrapper cannot be cast to javax.tools.FileObject の原因は?
  8. 結局、どう対応するのか?
  9. 最後に

手順

build.gradle を変更する

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

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

clean タスク → Rebuild Project → build タスクを実行する

clean タスク → Rebuild Project → build タスクを実行します。。。が、compileJava でエラーが出て止まりました。

f:id:ksby:20170305073102p:plain

ログを見た感じでは com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V が問題のような気がしますが、これだけではエラーの内容がよく分かりません。

コマンドプロンプトを開いて、プロジェクトのルートディレクトリに移動した 後 gradlew --stackstrace --debug build コマンドを実行してみます。

f:id:ksby:20170305073640p:plain

以下のログが出力されました。java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V と出ており、com.google.errorprone.BugCheckerInfo.create(BugCheckerInfo.java:98) からこのメソッドが呼び出されていますが、メソッドがないようです。

07:37:32.768 [ERROR] [org.gradle.BuildExceptionReporter] 
07:37:32.771 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
07:37:32.772 [ERROR] [org.gradle.BuildExceptionReporter] 
07:37:32.772 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
07:37:32.772 [ERROR] [org.gradle.BuildExceptionReporter] Execution failed for task ':compileJava'.
07:37:32.772 [ERROR] [org.gradle.BuildExceptionReporter] > java.lang.reflect.InvocationTargetException
07:37:32.773 [ERROR] [org.gradle.BuildExceptionReporter] 
07:37:32.773 [ERROR] [org.gradle.BuildExceptionReporter] * Exception is:
07:37:32.774 [ERROR] [org.gradle.BuildExceptionReporter] org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileJava'.
..........
07:37:32.787 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
07:37:32.787 [ERROR] [org.gradle.BuildExceptionReporter]    at com.google.errorprone.BugCheckerInfo.create(BugCheckerInfo.java:98)
07:37:32.787 [ERROR] [org.gradle.BuildExceptionReporter]    at com.google.errorprone.scanner.BuiltInCheckerSuppliers.getSuppliers(BuiltInCheckerSuppliers.java:239)
07:37:32.788 [ERROR] [org.gradle.BuildExceptionReporter]    at com.google.errorprone.scanner.BuiltInCheckerSuppliers.<clinit>(BuiltInCheckerSuppliers.java:268)
07:37:32.788 [ERROR] [org.gradle.BuildExceptionReporter]    at com.google.errorprone.ErrorProneCompiler$Builder.<init>(ErrorProneCompiler.java:96)
07:37:32.788 [ERROR] [org.gradle.BuildExceptionReporter]    ... 77 more
07:37:32.788 [ERROR] [org.gradle.BuildExceptionReporter] 
07:37:32.788 [LIFECYCLE] [org.gradle.BuildResultLogger] 
07:37:32.789 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED
07:37:32.789 [LIFECYCLE] [org.gradle.BuildResultLogger] 

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V の原因は?

IntelliJ IDEA で com.google.common.base.Preconditions クラスのソースを表示して checkArgument メソッドを見てみましたが、引数が (String, Object) のメソッドは存在しませんでした。必ず第1引数は boolean です。

f:id:ksby:20170307001538p:plain

checkArgument を呼び出している com.google.errorprone.BugCheckerInfo.create(BugCheckerInfo.java:98) を見てみましたが、どう見ても引数を3つ渡しています。エラーメッセージが出る意味がよく分かりません。。。

f:id:ksby:20170307001830p:plain

gradlew dependencies コマンドを実行して依存関係を確認してみます。

出力された結果を見たのですが、なぜか com.google.guava:guava:21.0 -> 17.0 と guava が 17.0 へバージョンダウンされています。出力結果を “com.google.guava:guava” で検索してもどこにも 17.0 が依存関係になっているものが見当たらず、なぜバージョンダウンされるのかが分かりません。。。

errorprone
\--- com.google.errorprone:error_prone_core:latest.release -> 2.0.18
     +--- com.google.errorprone:error_prone_annotation:2.0.18
     |    \--- com.google.guava:guava:21.0 -> 17.0
     +--- com.google.errorprone:error_prone_check_api:2.0.18
     |    +--- com.google.errorprone:error_prone_annotation:2.0.18 (*)
     |    +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     |    +--- org.checkerframework:dataflow:1.8.10
     |    |    \--- org.checkerframework:javacutil:1.8.10
     |    +--- com.google.errorprone:javac:9-dev-r3297-4
     |    +--- com.googlecode.java-diff-utils:diffutils:1.3.0
     |    \--- com.google.errorprone:error_prone_annotations:2.0.18
     +--- com.github.stephenc.jcip:jcip-annotations:1.0-1
     +--- org.pcollections:pcollections:2.1.2
     +--- com.google.guava:guava:21.0 -> 17.0
     +--- com.google.auto:auto-common:0.7
     |    \--- com.google.guava:guava:19.0 -> 17.0
     +--- com.google.code.findbugs:jFormatString:3.0.0
     +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     +--- org.checkerframework:dataflow:1.8.10 (*)
     +--- com.google.errorprone:javac:9-dev-r3297-4
     \--- com.google.errorprone:error_prone_annotations:2.0.18

build.gradle の resolutionStrategy.force で Guava の 21.0 を強制してみる

resolutionStrategy.force を記述することでライブラリのバージョンを強制指定することができるはずなので、build.gradle の configuration に resolutionStrategy.force "com.google.guava:guava:21.0" を追加してみます。

configurations {
    // for Doma 2
    domaGenRuntime

    // for Error Prone ( http://errorprone.info/ )
    errorprone {
        resolutionStrategy.force "com.google.errorprone:error_prone_core:${errorproneVersion}"
        resolutionStrategy.force "com.google.guava:guava:21.0"
    }
}

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

gradlew dependencies コマンドを実行してみましたが com.google.guava:guava:21.0 -> 17.0 のままでした。。。

errorprone
\--- com.google.errorprone:error_prone_core:latest.release -> 2.0.18
     +--- com.google.errorprone:error_prone_annotation:2.0.18
     |    \--- com.google.guava:guava:21.0 -> 17.0
     +--- com.google.errorprone:error_prone_check_api:2.0.18
     |    +--- com.google.errorprone:error_prone_annotation:2.0.18 (*)
     |    +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     |    +--- org.checkerframework:dataflow:1.8.10
     |    |    \--- org.checkerframework:javacutil:1.8.10
     |    +--- com.google.errorprone:javac:9-dev-r3297-4
     |    +--- com.googlecode.java-diff-utils:diffutils:1.3.0
     |    \--- com.google.errorprone:error_prone_annotations:2.0.18
     +--- com.github.stephenc.jcip:jcip-annotations:1.0-1
     +--- org.pcollections:pcollections:2.1.2
     +--- com.google.guava:guava:21.0 -> 17.0
     +--- com.google.auto:auto-common:0.7
     |    \--- com.google.guava:guava:19.0 -> 17.0
     +--- com.google.code.findbugs:jFormatString:3.0.0
     +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     +--- org.checkerframework:dataflow:1.8.10 (*)
     +--- com.google.errorprone:javac:9-dev-r3297-4
     \--- com.google.errorprone:error_prone_annotations:2.0.18

clean タスク → Rebuild Project → build タスクを実行してみましたが、結果は同じでした。

f:id:ksby:20170305082427p:plain

効果がなかったので build.gradle は元に戻します。

なぜ Guava のバージョンが 17.0 にバージョンダウンされるのか?

build.gradle に Guava の 17.0 なんて記述していないのに Guava がバージョンダウンされる原因となりそうなものに1つ心あたりがありました。それは Spring IO Platform の BOM です。以前マニュアルの Web ページを見て Guava のバージョンが妙に低いな、と思った記憶があります。

現在使用中の Spring IO Platform の Athens-SR3 の Spring IO Platform Reference Guide を開き “guava” で検索してみると、思ったとおり 17.0 でした。

f:id:ksby:20170305140121p:plain

また gradlew dependencies コマンドの出力結果を見ていて気づきましたが、Spring IO Platform の BOM は gradle plugin の依存関係のライブラリだけ強制的に BOM に記述されているバージョンを利用させるようです。

例えば compile の場合には Guava は build.gradle で明示している 21.0 が使用されていますが、

compile - Dependencies for source set 'main'.
+--- org.springframework.boot:spring-boot-starter-web: -> 1.4.4.RELEASE
|    +--- org.springframework.boot:spring-boot-starter:1.4.4.RELEASE
..........
+--- com.google.guava:guava:21.0
..........

checkstyle プラグインでは 17.0 にバージョンダウンされており、

checkstyle - The Checkstyle libraries to be used for this project.
\--- com.puppycrawl.tools:checkstyle:7.5.1
     +--- antlr:antlr:2.7.7
     +--- org.antlr:antlr4-runtime:4.6
     +--- commons-beanutils:commons-beanutils:1.9.3
     |    \--- commons-collections:commons-collections:3.2.2
     +--- commons-cli:commons-cli:1.3.1
     \--- com.google.guava:guava:19.0 -> 17.0

errorprone プラグインでも同様に 17.0 にバージョンダウンされています。

errorprone
\--- com.google.errorprone:error_prone_core:2.0.18
     +--- com.google.errorprone:error_prone_annotation:2.0.18
     |    \--- com.google.guava:guava:21.0 -> 17.0
     +--- com.google.errorprone:error_prone_check_api:2.0.18
     |    +--- com.google.errorprone:error_prone_annotation:2.0.18 (*)
     |    +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     |    +--- org.checkerframework:dataflow:1.8.10
     |    |    \--- org.checkerframework:javacutil:1.8.10
     |    +--- com.google.errorprone:javac:9-dev-r3297-4
     |    +--- com.googlecode.java-diff-utils:diffutils:1.3.0
     |    \--- com.google.errorprone:error_prone_annotations:2.0.18
     +--- com.github.stephenc.jcip:jcip-annotations:1.0-1
     +--- org.pcollections:pcollections:2.1.2
     +--- com.google.guava:guava:21.0 -> 17.0
     +--- com.google.auto:auto-common:0.7
     |    \--- com.google.guava:guava:19.0 -> 17.0
     +--- com.google.code.findbugs:jFormatString:3.0.0
     +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     +--- org.checkerframework:dataflow:1.8.10 (*)
     +--- com.google.errorprone:javac:9-dev-r3297-4
     \--- com.google.errorprone:error_prone_annotations:2.0.18

BOM で指定されているライブラリのバージョンを変更する

BOM で指定されているライブラリのバージョンを指定できる方法がないか Dependency management plugin のマニュアルを見てみたところ、Changing the value of a version propertybomProperty で変更できることが書いてありました。

http://repo.spring.io/repo/io/spring/platform/platform-bom/Athens-SR3/platform-bom-Athens-SR3.pom を見ると <guava.version>17.0</guava.version> という記述がありましたので、guava.version21.0 に変更すればよさそうです。

build.gradle を リンク先のその2の内容 に変更します。変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

gradlew dependencies コマンドを実行すると、今度は checkstyle plugin も errorprone plugin も Guava の 21.0 が使用されるようになりました。

checkstyle - The Checkstyle libraries to be used for this project.
\--- com.puppycrawl.tools:checkstyle:7.5.1
     +--- antlr:antlr:2.7.7
     +--- org.antlr:antlr4-runtime:4.6
     +--- commons-beanutils:commons-beanutils:1.9.3
     |    \--- commons-collections:commons-collections:3.2.2
     +--- commons-cli:commons-cli:1.3.1
     \--- com.google.guava:guava:19.0 -> 21.0

..........

errorprone
\--- com.google.errorprone:error_prone_core:2.0.18
     +--- com.google.errorprone:error_prone_annotation:2.0.18
     |    \--- com.google.guava:guava:21.0
     +--- com.google.errorprone:error_prone_check_api:2.0.18
     |    +--- com.google.errorprone:error_prone_annotation:2.0.18 (*)
     |    +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     |    +--- org.checkerframework:dataflow:1.8.10
     |    |    \--- org.checkerframework:javacutil:1.8.10
     |    +--- com.google.errorprone:javac:9-dev-r3297-4
     |    +--- com.googlecode.java-diff-utils:diffutils:1.3.0
     |    \--- com.google.errorprone:error_prone_annotations:2.0.18
     +--- com.github.stephenc.jcip:jcip-annotations:1.0-1
     +--- org.pcollections:pcollections:2.1.2
     +--- com.google.guava:guava:21.0
     +--- com.google.auto:auto-common:0.7
     |    \--- com.google.guava:guava:19.0 -> 21.0
     +--- com.google.code.findbugs:jFormatString:3.0.0
     +--- com.google.code.findbugs:jsr305:3.0.0 -> 3.0.1
     +--- org.checkerframework:dataflow:1.8.10 (*)
     +--- com.google.errorprone:javac:9-dev-r3297-4
     \--- com.google.errorprone:error_prone_annotations:2.0.18

clean タスク → Rebuild Project → build タスクを実行してみます。

今度は lombok 関連と思われるエラーが出て BUILD FAILED になりました。

f:id:ksby:20170305145738p:plain f:id:ksby:20170305145845p:plain f:id:ksby:20170305145954p:plain

java.lang.ClassCastException: lombok.javac.apt.Javac7BaseFileObjectWrapper cannot be cast to javax.tools.FileObject の原因は?

エラーの原因を1つずつ調べていきます。まずは java.lang.ClassCastException: lombok.javac.apt.Javac7BaseFileObjectWrapper cannot be cast to javax.tools.FileObject からです。

lombok.javac.apt.Javac7BaseFileObjectWrapper クラスのソースを表示させてみたところ、継承元の com.sun.tools.javac.file.BaseFileObjectjavac が赤字で表示されています。com.sun.tools.javac.file.BaseFileObject クラスが含まれているライブラリが gradle により自動でロードされていないためのようです。

f:id:ksby:20170305175249p:plain

com.sun.tools.javac.file.BaseFileObject クラスが含まれるライブラリを調べたところ、com.sun.tools.javac.file.BaseFileObject - snacktrace のページがヒットしました。このライブラリを build.gradle に追記してみます。

build.gradle を リンク先のその3の内容 に変更します。変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

lombok.javac.apt.Javac7BaseFileObjectWrapper クラスのソースを表示させてみると、com.sun.tools.javac.file.BaseFileObjectjava の赤字は解消されていましたが、今度は class の行に赤波線が表示されていました。また LombokFileObject が赤字です。

f:id:ksby:20170305201258p:plain

IntelliJ IDEA の画面上部のパッケージ階層表示から lombok.javac.apt の下にある一覧を表示させてみましたが LombokFileObject は存在します。中のソースも見てみましたが、特におかしいところは見られませんでした。

f:id:ksby:20170305201607p:plain

Project Tool Window で org.projectlombok:lombok:1.16.12 の内容を表示させてみたところ、LombokFileObject は LombokFileObject.SCL.lombok というファイル名になっていてインターフェースとして表示されません。

f:id:ksby:20170305201926p:plain

通常は以下のようにインターフェースのアイコンが表示されます。

f:id:ksby:20170305202452p:plain

この状態で clean タスク → Rebuild Project → build タスクを実行しても以前と同じエラーが出ます。

f:id:ksby:20170305203000p:plain f:id:ksby:20170305203115p:plain

どうすればよいのか分からなくなったので Web でいろいろ検索してみたところ、以下の GitHub の Issue が見つかりました。

Issue を呼んだ感じでは、

  • どうやらこれは lombok + Error Prone を組み合わせた時のエラーらしい。
  • Error Prone のバグではなく lombok が javac 9 に対応していないためのようだ。Error Prone の出すメッセージは JDK 9 で問題となる箇所を指摘していたし、IntelliJ IDEA で使用する Java Compiler も「Javac」→「Javac with error-prone」へ変更したので、Error Prone を入れた後のコンパイルは素の JDK 8 のコンパイルとは違って JDK 9 用に何かしているようだ。
  • lombok は一旦対応して Error Prone の 2.0.15 ではエラーが出なくなったようだが ( 確かに 2.0.15 ではエラーは出ていなかった! )、2.0.18 でまた別のエラーが出ている模様。

という訳で、lombok が対応しないと Error Prone は 2.0.18 にバージョンアップできなさそうです。Error Prone の 2.0.16 以降でコンパイルエラーにならないバージョンがあるのか確認してみましたが、2.0.16 からダメでした。

結局、どう対応するのか?

以下のように対応することにします。

  • net.ltgt.gradle:gradle-errorprone-plugin は 0.0.8 → 0.0.9 へバージョンアップします。
  • com.google.errorprone:error_prone_core はバージョンアップせずに 2.0.15 のままとします。
  • com.google.errorprone:error_prone_core のバージョンの指定を configurations.errorprone に記述していましたが、Gradle error-prone plugin を見てみたら dependencies に書けることが分かったので、dependencies に書くようにします。
  • Guava のように Spring IO Platform の BOM に記述があるものは dependencyManagement の方に bomProperty でバージョンを指定して、dependencies にはバージョン番号を記述しないようにします。以下のライブラリを変更します。
    • com.google.guava:guava ( bomProperty で 21.0 を指定します )
    • org.apache.commons:commons-lang3 ( bomProperty で 3.5 を指定します )
  • com.google.errorprone:error_prone_core を 2.0.15 のままにすることにしたので compileOnly("org.checkerframework:compiler:2.1.9") は削除します。

build.gradle を リンク先の最終形の内容 の内容に変更します。変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

clean タスク → Rebuild Project → build タスクを実行すると “BUILD SUCCESSFUL” が出力されました。

f:id:ksby:20170306020126p:plain

最後に

Error Prone ですが、JDK 9 対応のためなのか 2.0.16 以降はどうも素直にバージョンアップできないようです。以外に癖のあるライブラリでした。。。

普通に Web アプリケーションを作るだけならば入れない方が無難かもしれません。自分はもうしばらく入れたままにして様子を見たいと思います。

ソースコード

build.gradle

■その1

buildscript {
    ..........
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
        // for Error Prone ( http://errorprone.info/ )
        classpath("net.ltgt.gradle:gradle-errorprone-plugin:0.0.9")
        // for Grgit
        classpath("org.ajoberstar:grgit:1.8.0")
        // Gradle Download Task
        classpath("de.undercouch:gradle-download-task:3.2.0")
    }
}

..........

ext {
    errorproneVersion = '2.0.18'
}

configurations {
    // for Doma 2
    domaGenRuntime

    // for Error Prone ( http://errorprone.info/ )
    errorprone {
        resolutionStrategy.force "com.google.errorprone:error_prone_core:${errorproneVersion}"
    }
}

..........

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

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    ..........
    compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}")
    ..........
}
  • buildscript の classpath("net.ltgt.gradle:gradle-errorprone-plugin:0.0.8")classpath("net.ltgt.gradle:gradle-errorprone-plugin:0.0.9") へ変更します。
  • ext { errorproneVersion = '2.0.18' } を追加します。configurations と dependencies それぞれに Error Prone のバージョンを記述していましたが、1箇所修正すればよいようにします。
  • configurations の resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.15'resolutionStrategy.force "com.google.errorprone:error_prone_core:${errorproneVersion}" へ変更します。
  • dependencies の compileOnly("com.google.errorprone:error_prone_annotations:2.0.15")compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}") へ変更します。

■その2

dependencyManagement {
    imports {
        mavenBom("io.spring.platform:platform-bom:Athens-SR3") {
            bomProperty 'guava.version', '21.0'
        }
    }
}
  • mavenBom を () を付けて io.spring.platform:platform-bom:Athens-SR3 を渡すように変更した後、{ bomProperty 'guava.version', '21.0' } を追加します。

■その3

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

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    ..........
    compile("com.univocity:univocity-parsers:2.3.1")
    compileOnly("org.checkerframework:compiler:2.1.9")
    testCompile("org.dbunit:dbunit:2.5.3")
    ..........
  • compileOnly("org.checkerframework:compiler:2.1.9") を追加します。

■最終形

buildscript {
    ext {
        springBootVersion = '1.4.4.RELEASE'
    }
    repositories {
        jcenter()
        maven { url "http://repo.spring.io/repo/" }
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
        // for Error Prone ( http://errorprone.info/ )
        classpath("net.ltgt.gradle:gradle-errorprone-plugin:0.0.9")
        // for Grgit
        classpath("org.ajoberstar:grgit:1.8.0")
        // Gradle Download Task
        classpath("de.undercouch:gradle-download-task:3.2.0")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'de.undercouch.download'
apply plugin: 'groovy'
apply plugin: 'net.ltgt.errorprone'
apply plugin: 'checkstyle'
apply plugin: 'findbugs'

sourceCompatibility = 1.8
targetCompatibility = 1.8

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

[compileJava, compileTestGroovy, compileTestJava]*.options*.compilerArgs = ['-Xlint:all,-options,-processing,-path']

// for Doma 2
// JavaクラスとSQLファイルの出力先ディレクトリを同じにする
processResources.destinationDir = compileJava.destinationDir
// コンパイルより前にSQLファイルを出力先ディレクトリにコピーするために依存関係を逆転する
compileJava.dependsOn processResources

jar {
    baseName = 'ksbysample-webapp-lending'
    version = '1.1.0-RELEASE'
}

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

configurations {
    // for Doma 2
    domaGenRuntime
}

checkstyle {
    configFile = file("${rootProject.projectDir}/config/checkstyle/google_checks.xml")
    toolVersion = '7.5.1'
    sourceSets = [project.sourceSets.main]
}

findbugs {
    toolVersion = '3.0.1'
    sourceSets = [project.sourceSets.main]
    ignoreFailures = true
    effort = "max"
    excludeFilter = file("${rootProject.projectDir}/config/findbugs/findbugs-exclude.xml")
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

repositories {
    jcenter()
}

dependencyManagement {
    imports {
        mavenBom("io.spring.platform:platform-bom:Athens-SR3") {
            bomProperty 'commons-lang3.version', '3.5'
            bomProperty 'guava.version', '21.0'
        }
    }
}

bootRepackage {
    mainClass = 'ksbysample.webapp.lending.Application'
    excludeDevtools = true
}

dependencies {
    def jdbcDriver = "org.postgresql:postgresql:9.4.1212"
    def spockVersion = "1.1-groovy-2.4-rc-3"
    def domaVersion = "2.15.0"
    def lombokVersion = "1.16.12"
    def errorproneVersion = '2.0.15'

    // dependency-management-plugin によりバージョン番号が自動で設定されるもの
    // Appendix A. Dependency versions ( http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions ) 参照
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")
    compile("org.thymeleaf.extras:thymeleaf-extras-java8time")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-freemarker")
    compile("org.springframework.boot:spring-boot-starter-mail")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework.boot:spring-boot-starter-data-redis")
    compile("org.springframework.boot:spring-boot-starter-amqp")
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.session:spring-session")
    compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
    compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")
    compile("com.google.guava:guava")
    compile("org.apache.commons:commons-lang3")
    compile("org.codehaus.janino:janino")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("org.springframework.security:spring-security-test")
    testCompile("org.yaml:snakeyaml")

    // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
    runtime("${jdbcDriver}")
    compile("org.seasar.doma:doma:${domaVersion}")
    compile("org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16")
    compile("org.simpleframework:simple-xml:2.7.1")
    compile("com.univocity:univocity-parsers:2.3.1")
    testCompile("org.dbunit:dbunit:2.5.3")
    testCompile("com.icegreen:greenmail:1.5.3")
    testCompile("org.assertj:assertj-core:3.6.2")
    testCompile("com.jayway.jsonpath:json-path:2.2.0")
    testCompile("org.jmockit:jmockit:1.30")
    testCompile("org.spockframework:spock-core:${spockVersion}") {
        exclude module: "groovy-all"
    }
    testCompile("org.spockframework:spock-spring:${spockVersion}") {
        exclude module: "groovy-all"
    }
    testCompile("com.google.code.findbugs:jsr305:3.0.1")

    // for lombok
    compileOnly("org.projectlombok:lombok:${lombokVersion}")
    testCompileOnly("org.projectlombok:lombok:${lombokVersion}")

    // for Doma-Gen
    domaGenRuntime("org.seasar.doma:doma-gen:${domaVersion}")
    domaGenRuntime("${jdbcDriver}")

    // for Error Prone ( http://errorprone.info/ )
    errorprone("com.google.errorprone:error_prone_core:${errorproneVersion}")
    compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}")
}

..........

履歴

2017/03/06
初版発行。
2017/03/07
* com.google.common.base.Preconditions#checkArgument に関する記述でメソッドがないのにあると書いていたので、見直して修正しました。