5

我目前正在开发一个导入两个不同 Maven BOM 的 Gradle 5 项目。因此,我使用没有依赖管理插件的原生 Gradle 语法。但是,两个 BOM 可能会为相同的依赖项定义不同的版本。

dependencies {
    implementation platform ("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
    implementation platform ("com.organisation:xyz:${otherBomVersion}")
}

据我所知,在 Maven 中,为给定依赖项定义版本的第一个 BOM 决定了它。相反,在Gradle 依赖管理插件中,为给定依赖定义版本的最后一个 BOM 决定了它。

纯 Gradle 5 中如何处理导入 BOM 的顺序?

4

2 回答 2

2

在 Gradle 中,BOM 的顺序或声明依赖项的位置根本不重要。与使用最接近优先方法的 Maven 不同,Gradle 会考虑所有依赖信息并选择最高的。该文件指出

Gradle 将考虑所有请求的版本,无论它们出现在依赖图中的任何位置。在这些版本中,它将选择最高的版本。

一个实际的例子。以下声明将始终选择2.2.5.RELEASE由 spring-cloud-dependencies BOM 版本定义的 Spring Cloud Gateway,Hoxton.SR8无论哪个platform()声明首先列出:

dependencies {
    implementation platform('org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8')
    implementation platform('org.springframework.cloud:spring-cloud-dependencies:Greenwich.SR6')
    
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}

依赖性洞察报告可能如下所示:

> gradlew -q dependencyInsight --dependency spring-cloud-starter-gateway
org.springframework.cloud:spring-cloud-starter-gateway:2.2.5.RELEASE (by constraint)
   variant "compile" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library (not requested)

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.version         = 8
   ]

org.springframework.cloud:spring-cloud-starter-gateway:2.2.5.RELEASE
\--- org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8
     \--- compileClasspath

org.springframework.cloud:spring-cloud-starter-gateway -> 2.2.5.RELEASE
\--- compileClasspath

enforcedPlatform()如果您更喜欢来自特定 BOM 的版本,您可以使用。

于 2020-10-26T19:52:28.550 回答
1

一个更简单的建议是使用Spring Boot Gradle Plugin文档中描述的这种机制,从而您可以显式覆盖通过设置属性选择的版本。

他们给出的例子:

ext['slf4j.version'] = '1.7.20'

您可以设置的属性的完整列表可以在Spring Boot 参考文档中找到。

最后,您将有一种明确的方式来覆盖 Spring Boot 给出的默认值。

啊,现在我看到你实际上并没有使用那个插件,所以这个机制不适用于你。好吧,如果您开始使用它,上述内容应该可以按预期工作并且是可预测的。

于 2020-10-22T14:16:01.713 回答