Gradle 依赖项解析的逻辑是什么



在Gradle 6.7中,我们有一个dependencyManagement.dependencies来设置项目的默认值。

最近,有人用dependencySet替换了Spring的单个dependency行。

dependencySet(group: 'org.springframework.boot', version: "2.2.11.RELEASE") {
entry 'spring-boot-devtools'
entry 'spring-boot-dependencies'
entry 'spring-boot-devtools'
entry 'spring-boot-starter-aop'
entry 'spring-boot-starter-cache'
entry 'spring-boot-starter-webflux'
...

现在,在发现一些CVE警报后,我发现Gradle无论如何都会将spring-boot-starter-cache解析为2.2.8。我不确定它是从哪里得到的:我们的项目中没有它,deps树看起来就像我们自己要求的一样(它处于0级(。

+--- org.springframework.boot:spring-boot-starter-cache -> 2.2.8.RELEASE

当我明确地添加项目时,正如我们之前对所有人所做的那样,

dependency 'org.springframework.boot:spring-boot-starter-cache:2.2.11.RELEASE'

那么它最终被解析为2.2.11。

+--- org.springframework.boot:spring-boot-starter-cache -> 2.2.11.RELEASE

在Maven中,与此相比,依赖关系管理非常简单:您可以使用依赖关系管理和BOM来控制它,所有这些都可以工作,这并不奇怪。

所以,也许我在Gradle的逻辑中遗漏了一些东西,即使在阅读了依赖管理指南之后也是如此。

如何使用类似dependencySet的BOM来同时控制所有entry?或者我有错误的假设?

在Gradle 6.7中,我们有一个dependencyManagement.dependencies来设置项目的默认值。

不要混淆Spring的依赖管理Gradle插件和Gradle的本地依赖管理功能。尽管他们实现了相同的目标,但他们的方式却截然不同。

我不确定它是从哪里得到的:我们的项目中没有它,deps树看起来就像我们自己要求的一样(它处于0级(。

您可以使用dependencyInsight任务来获取有关特定依赖项以及选择特定版本的原因的更多信息。

./gradlew dependencyInsight --dependency org.springframework.boot:spring-boot-starter-cache

请参阅查看和调试依赖项了解更多详细信息。

如何使用类似dependencySet的BOM来同时控制所有entry?或者我有错误的假设?

Spring依赖关系管理插件的文档清楚地表明了您需要做些什么来实现这一点:https://docs.spring.io/dependency-management-plugin/docs/current/reference/html/#dependency-管理配置dsl依赖集

如果它没有如您所期望的那样工作,那么您需要调试您的依赖项,正如我在上面链接的那样。

此外,从您的示例中,我猜您有一个典型的Spring Boot应用程序,其中应用了Spring Boot Gradle插件。如果是,那么Spring Boot Gradle插件会检测是否应用了Spring依赖关系管理插件,并自动导入Spring Boot BOM。因此,不应该像现在这样管理特定于Spring的依赖关系。

相关内容

  • 没有找到相关文章

最新更新