GradleのBOMの機能を使う場合、依存関係のバージョンを古いバージョンで上書きすることはできない

これはGradle 5.0, 5.1, 5.2, 6.1.1で再現しています。 間のバージョンでは再現しないかもしれません。

BOMによって依存関係のバージョンを管理してる際に enforcedPlatformを使ってないのにも関わらず、プロジェクトで個別に依存関係の上書きができる場合と出来ない場合があります。

これはBOMによって挙動が変わっていそうなのですが原因が全く分かりません。 BOMを見比べてもおかしなところは無いように見えます。

条件が分かってないので具体的な例を挙げます。

jackson-bomを使った場合は上書きできる。

dependencies {
  implementation platform('com.fasterxml.jackson:jackson-bom:2.9.7')
  // 上書きできる
  implementation 'com.fasterxml.jackson.core:jackson-annotations:2.9.8' 
}

spring-boo-dependenciesを使った場合、なぜか上書き出来ない。 追記: なぜかelasticsearchの依存だけ個別アップグレードできません。なぜ?

dependencies {
  implementation platform("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE")
  // なぜか上書きできない
  implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.3.2'
}

ワークアラウンドは一つだけあって forceにtrueを設定することで上書きすることが出来ます。

dependencies {
  implementation platform("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE")
  implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.3.2', { force = true }
}

終わり。 Issueは立てておきました。

github.com

困ったなぁ・・・

追記1

ブログを書いた後に他の依存関係も追加してみたところなぜかelasticsearchの依存だけアップデートできない、という形になっている。なぜだろう・・・

dependencies {
  implementation platform("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE")
  // We cannot override dependencies!! Why !?!?!?!
  // I am not sure, but I seem that we can not override version of dependency for elasticsearch...
  implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.3.2' 

  // We can override dependency
  implementation 'com.fasterxml.jackson.core:jackson-core:2.10.2'
  // We can override dependency
  implementation 'io.reactivex.rxjava2:rxjava:2.2.17'
  // We can override dependency
  implementation 'org.hibernate:hibernate-core:5.4.11.Final'
}

追記2

どうやらBOMで指定されているバージョンより古いバージョンを指定することが出来ないようだ。

ref