隐式导入的 Maven BOM 文件是否在 Gradle 中占主导地位?

Are implicitly imported Maven BOM files dominant in Gradle?

我开发了一个 Spring Boot 2.0.x 应用程序,它使用 Gradle 5.2.1 导入多个 Maven BOM,包括自定义和官方 Spring BOM。因此,我使用 Gradle 提供的 platform 语法。但是,我也将 dependency-management 插件与 Spring Boot Gradle 插件结合使用。

apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.springframework.boot'

dependencies {
    compile platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
    compile platform("com.myOrg:custom-bom:${latestVersion}")
}

根据 docs 这种插件组合会触发包含 Spring 启动 BOM 文件。但是,我不知道这个隐式包含的 BOM 如何符合 BOM 的常规顺序。它是首先应用并因此可以被其他 BOM 覆盖,还是最后应用并因此支配所有其他 BOM 文件?

在 Gradle 世界中,仅 platform 使用 BOM,没有优先规则。 Gradle 将考虑 所有 由不同 BOM 和传递依赖项 带来的约束,如果他们推荐不同的冲突,则以通常的方式解决它们版本。

我不是 Spring dependency-management 插件的专家,但我的理解是它旨在复制 Maven BOM 契约:BOM 的版本否决任何传递版本并且可以反过来被本地版本声明否决。

如果这种理解是正确的,那么 dependency-management 插件将对其导入的 BOM 涵盖的所有依赖项应用其规则。插件未涵盖的任何内容都将遵守 Gradle 规则。

从这个意义上说,这种混合可能不是理想的情况,因为 BOM 内容在任一方向上对版本的更改都可能对解决的依赖关系产生相当严重的影响。