Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その14 )( spring-boot-gradle-plugin は dependency-management-plugin を自動的に適用するので build.gradle に記述する必要がありませんでした )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- 今年に入ってから dependency-management-plugin の 1.0.0.RELEASE や 1.0.1.RELEASE がリリースされていることに気付いたので適用しようとしていたのですが、なぜかエラーが出て適用できません。
- 調査のために Web でいろいろ調べていたのですが、Spring Boot Reference Guide の 67. Spring Boot Gradle plugin に
The spring-boot plugin automatically applies the Dependency Management Plugin
の文章を見つけました。 - spring-boot-gradle-plugin も Appendix F. Dependency versions に書かれているモジュールについて自動的に依存性解決してくれることは知っていましたが、以前書いた Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( 番外編 )( IntelliJ IDEA Ultimate Edition での Spring Boot プロジェクトの作成 ) の記事で、自動生成された build.gradle に
classpath("io.spring.gradle:dependency-management-plugin:0.5.1.RELEASE")
の記述があったため、入れるものだと思い続けていたようです。 The spring-boot plugin automatically applies the Dependency Management Plugin
の記述通りなら build.gradle に dependency-management-plugin を書く必要はないと思われるので、確認してみます。
参照したサイト・書籍
目次
- まずは単に
classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
をコメントアウトしてみる dependencyManagement { ... }
もコメントアウトするとどうなるのか?- Spring IO Platform の POM を記述した場合と記述しない場合で何が違うのか?
- build.gradle を修正する
- 次回は。。。
手順
まずは単に classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
をコメントアウトしてみる
build.gradle から dependency-management-plugin に関する部分をコメントアウトしてみます。
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'
- 以下の記述の行をコメントアウトします。
classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
apply plugin: 'io.spring.dependency-management'
コメントアウト後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、エラーは出ずに終了しました。
clean タスク → Rebuild Project → build タスク も実行してみましたが、こちらも無事 “BUILD SUCCESSFUL” が表示されました。
gradlew dependencies
コマンドを実行してみると checkstyle が依存する guava のバージョンが 21.0 になっています。Spring Boot 1.4.5 の Appendix F. Dependency versions には com.google.guava:guava
の記述はないので、build.gradle に記述している dependencyManagement { imports { mavenBom("io.spring.platform:platform-bom:Athens-SR3") { ... } } }
の BOM の内容が反映されていることが確認できます。
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
よって、Spring IO Platform の BOM を利用したい場合には spring-boot-gradle-plugin だけ記述すればよく、dependency-management-plugin を記述する必要はありませんでした。
dependencyManagement { ... }
もコメントアウトするとどうなるのか?
更に build.gradle の dependencyManagement { ... }
を削除するとどうなるのか興味が湧いたので、試してみます。
//dependencyManagement { // imports { // mavenBom("io.spring.platform:platform-bom:Athens-SR3") { // bomProperty 'commons-lang3.version', '3.5' // bomProperty 'guava.version', '21.0' // } // } //}
コメントアウト後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、以下のエラーが表示されました。
これだけでは原因が分からないので、コマンドラインから gradlew dependencies
コマンドを実行してみると以下のエラーが表示されました。guava と commons-lang3 の依存性解決に失敗したのが原因でした。
Spring Boot 1.4.5 の Appendix F. Dependency versions には guava も commons-lang3 も記述されていないので当然と言えば当然ですね。
build.gradle の dependencies 内で guava と commons-lang3 にバージョン番号を明記してみます。
compile("com.google.guava:guava:21.0") compile("org.apache.commons:commons-lang3:3.5")
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、エラーは出ずに終了しました。
clean タスク → Rebuild Project → build タスク を実行すると、無事 “BUILD SUCCESSFUL” が表示されました。ただしなんか足りないライブラリをダウンロードしています。
gradlew dependencies
コマンドを実行してみると checkstyle が依存する Guava のバージョンは 19.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
Spring IO Platform の POM を記述した場合と記述しない場合で何が違うのか?
両方の場合の gradlew dependencies
コマンドの出力結果を比較してみました。
■checkstyle - The Checkstyle libraries to be used for this project.
component | 記述した場合 | 記述しない場合 |
---|---|---|
com.google.guava:guava | 21.0 | 19.0 |
■errorprone
component | 記述した場合 | 記述しない場合 |
---|---|---|
com.google.guava:guava | 21.0 | 20.0 |
com.google.code.findbugs:jsr305 | 3.0.1 | 3.0.0 |
■findbugs - The FindBugs libraries to be used for this project.
component | 記述した場合 | 記述しない場合 |
---|---|---|
com.google.code.findbugs:jsr305 | 3.0.1 | 3.0.0 |
■上記以外
component | 記述した場合 | 記述しない場合 |
---|---|---|
javax.activation:activation | 1.1.1 | 1.1 |
com.rabbitmq:amqp-client | 3.6.6 | 3.6.5 |
org.objenesis:objenesis | 2.4 | 2.1 |
guava, commons-lang3 以外にも BOM を記述した方がバージョンが上がるものがあります。
build.gradle を修正する
Spring IO Platform の BOM を記述した方が guava や commons-lang3 も依存性解決の対象になって個人的には好みなので、今回は単に dependency-management-plugin の記述だけを削除することにします。
build.gradle を リンク先の内容 に変更した後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。問題が出ないことは上に書きましたので、ここでは改めて記述しません。
次回は。。。
Spring Boot 1.4 で一番変更が入ったと聞いているテストクラスのアノテーションを見直します。
ソースコード
build.gradle
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}") // 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: 'de.undercouch.download' apply plugin: 'groovy' apply plugin: 'net.ltgt.errorprone' apply plugin: 'checkstyle' apply plugin: 'findbugs'
classpath("io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE")
を削除します。apply plugin: 'io.spring.dependency-management'
を削除します。
履歴
2017/03/24
初版発行。