在使用Gradle项目时,我发现它并不总是遵守声明的约束。一个简单的例子是spring-boot-starter-tomcat:3.1.3
拉入tomcat-embed-core
,但它需要的版本是10.1.12,目前已打开CVE 2023-41080。通常,我应该能够为10.1.13设置一个约束,它目前没有任何打开的CVE。
问题是,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 '...'
}
}
}
我的依赖关系树解析为:
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)
Gradle文档告诉我:
https://docs.gradle.org/current/userguide/dependency_constraints.html
开发人员经常通过添加直接依赖关系来错误地修复传递依赖关系问题。为了避免这种情况,Gradle提供了依赖约束的概念。
但这是让Tomcat升级版本的唯一方法。在添加依赖关系约束时,我误解了什么?为什么Gradle不支持这些配置?
1条答案
按热度按时间vqlkdk9b1#
您可以覆盖这样的约束,例如在
resolutionStrategy
中使用force
。如果你使用Spring Dependency Management插件,我认为从我所看到的,这正是这样做。
如果你真的坚持使用这个插件的话,它可以使用你应该使用的属性覆盖版本。
但实际上,你应该停止使用这个插件。它是Gradle没有内置BOM支持的时代的遗物,现在弊大于利。即使是该插件的维护者也建议不要再使用它。因此,我强烈建议您删除该插件,而是使用内置的BOM支持使用
platform(...)
,那么您的约束也应该相应地考虑。有关更多信息,请查看Sping Boot 文档、Gradle文档和插件维护者的声明。