しおしお

IntelliJ IDEAのことなんかを書いてます

Gradle 5.0でMavenのBOMを使おう

Managing Transitive Dependenciesあたりをお試ししてみました。

implementation platformを使ってみる

build.gradle

BOMをimplementation platformに指定します。
BOMで定義されているバージョンを使用するので、個別のライブラリ(この例ではjackson-databind)にはバージョン指定は不要となります。

dependencies {
  implementation platform('com.fasterxml.jackson:jackson-bom:2.9.7')
  implementation 'com.fasterxml.jackson.core:jackson-databind'
}

dependenciesの結果

バージョンを指定しなくても、BOMのバージョンが適用されていますね

+--- com.fasterxml.jackson:jackson-bom:2.9.7
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|    +--- com.fasterxml.jackson.core:jackson-core:2.9.7
|    \--- com.fasterxml.jackson.core:jackson-databind:2.9.7
|         +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|         \--- com.fasterxml.jackson.core:jackson-core:2.9.7
\--- com.fasterxml.jackson.core:jackson-databind -> 2.9.7 (*)

個別のライブラリに明示的にバージョンを指定してみると

明示的に新しいバージョンを指定してみます。

dependencies {
  implementation platform('com.fasterxml.jackson:jackson-bom:2.9.7')
  implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
}

dependenciesを見てみると、明示的に指定したバージョンが適用されています。
このように、明示的にバージョンが指定された場合でもBOMバージョンを強制したい場合には、enforcedPlatformを使う必要があります。

+--- com.fasterxml.jackson:jackson-bom:2.9.7
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|    +--- com.fasterxml.jackson.core:jackson-core:2.9.7 -> 2.9.8
|    \--- com.fasterxml.jackson.core:jackson-databind:2.9.7 -> 2.9.8
|         +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|         \--- com.fasterxml.jackson.core:jackson-core:2.9.8
\--- com.fasterxml.jackson.core:jackson-databind:2.9.8 (*)

implementation enforcedPlatformを使ってみる

build.gradle

platformenforcedPlatformにBOMを指定します。

dependencies {
  implementation enforcedPlatform('com.fasterxml.jackson:jackson-bom:2.9.7')
  implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
}

dependenciesの結果

個別指定のバージョンが、BOMに定義されているバージョンで上書きされるようになしました。

+--- com.fasterxml.jackson:jackson-bom:2.9.7
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|    +--- com.fasterxml.jackson.core:jackson-core:2.9.7
|    \--- com.fasterxml.jackson.core:jackson-databind:2.9.7
|         +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|         \--- com.fasterxml.jackson.core:jackson-core:2.9.7
\--- com.fasterxml.jackson.core:jackson-databind:2.9.8 -> 2.9.7 (*)

Gradle4.6-RC1でお試し追加されたBOM対応を動かしてみると

Gradle4.6 RC1で追加されたお試し版は動かないですね!

+--- com.fasterxml.jackson:jackson-bom:2.9.7
\--- com.fasterxml.jackson.core:jackson-databind FAILED