在使用 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 不支持这些配置?
您可以覆盖此类约束,例如通过force在resolutionStrategy.
如果您使用 Spring 依赖管理插件(我从我所看到的情况来看),这正是这样做的。
如果您确实坚持使用该插件,它可以使用您应该使用的属性来覆盖版本。
但实际上,你应该停止使用该插件。它是 Gradle 没有内置 BOM 支持的时代遗留下来的,现在弊大于利。即使该插件的维护者也建议不要再使用它。因此,我强烈建议您删除该插件,转而使用内置的 BOM 支持platform(...),然后您的约束也应该相应地考虑在内。
有关更多信息,请查看Spring Boot 文档、Gradle 文档和插件维护者的声明。
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |