为什么 Gradle 并不总是满足约束请求?

Chr*_*ris 3 java gradle

在使用 Gradle 项目时,我发现它并不总是遵守声明的约束。一个简单的例子是spring-boot-starter-tomcat:3.1.3拉入,tomcat-embed-core但它需要的版本是 10.1.12,当前已开放 CVE 2023-41080。通常我应该能够对当前没有任何开放 CVE 的 10.1.13 施加约束。

问题是 Gradle 并不总是满足这个请求。举个简单的例子:

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-tomcat:3.1.3')
    constraints {
        // Bumping the version of Tomcat embedded as there are CVEs on 10.1.12
        implementation('org.apache.tomcat.embed:tomcat-embed-websocket:10.1.13') {
            because '...'
        }
        implementation('org.apache.tomcat.embed:tomcat-embed-core:10.1.13') {
            because '...'
        }
        implementation('org.apache.tomcat.embed:tomcat-embed-el:10.1.13') {
            because '...'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的依赖树解析如下:

compileClasspath - Compile classpath for source set 'main'.
+--- org.springframework.boot:spring-boot-starter-tomcat:3.1.3
|    +--- jakarta.annotation:jakarta.annotation-api:2.1.1
|    +--- org.apache.tomcat.embed:tomcat-embed-core:10.1.12
|    +--- org.apache.tomcat.embed:tomcat-embed-el:10.1.12
|    \--- org.apache.tomcat.embed:tomcat-embed-websocket:10.1.12
|         \--- org.apache.tomcat.embed:tomcat-embed-core:10.1.12
+--- org.apache.tomcat.embed:tomcat-embed-core:10.1.13 -> 10.1.12 (c)
+--- org.apache.tomcat.embed:tomcat-embed-el:10.1.13 -> 10.1.12 (c)
\--- org.apache.tomcat.embed:tomcat-embed-websocket:10.1.13 -> 10.1.12 (c)
Run Code Online (Sandbox Code Playgroud)

Gradle 文档告诉我:

https://docs.gradle.org/current/userguide/dependency_constraints.html

开发人员经常通过添加直接依赖项来错误地修复传递依赖项问题。为了避免这种情况,Gradle 提供了依赖约束的概念。

但这是让Tomcat升级版本的唯一方法。添加依赖项约束时我有什么误解,为什么 Gradle 不支持这些配置?

Vam*_*ire 5

您可以覆盖此类约束,例如通过forceresolutionStrategy.

如果您使用 Spring 依赖管理插件(我从我所看到的情况来看),这正是这样做的。
如果您确实坚持使用该插件,它可以使用您应该使用的属性来覆盖版本。

但实际上,你应该停止使用该插件。它是 Gradle 没有内置 BOM 支持的时代遗留下来的,现在弊大于利。即使该插件的维护者也建议不要再使用它。因此,我强烈建议您删除该插件,转而使用内置的 BOM 支持platform(...),然后您的约束也应该相应地考虑在内。

有关更多信息,请查看Spring Boot 文档Gradle 文档插件维护者的声明