在处理Gradle项目时,我发现它并不总是遵守声明的约束.一个简单的例子是spring-boot-starter-tomcat:3.1.3Pull in tomcat-embed-core,但它需要的版本是10.1.12,该版本当前打开了CVE2023-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 '...'
        }
    }
}

我的依赖关系树解析为:

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不支持这些配置?

推荐答案

例如,您可以通过在resolutionStrategy中使用force来覆盖此类约束.

If you use the Spring Dependency Management plugin which I assume from what I see, this does exactly that.
It has ways to override versions using properties that you should use instead if you really insist on using that plugin.

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

有关更多信息,请查看the Spring Boot documentationthe Gradle documentationthe statement of the plugin maintainer.

Java相关问答推荐

当切换javaFX场景时,stage的大小正在Minimize

@从类文件中删除JsonProperty—Java

Java中的死锁及其重入锁和锁

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

为什么Java编译器不区分不同类型的方法?

如何为JavaFX Spring Boot应用程序制作Windows/MacOS/Linux安装程序

Sack()步骤中的合并运算符未按预期工作

Cordova Android Gradle内部版本组件不兼容

有谁能帮我修一下这个吗?使输出变得更加整洁

对角线填充二维数组

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

泛型与泛型问题的完美解决方案?

如何通过Java java.lang.Foreign API访问本机字节数组

rest api服务 spring 启动中出现IllegalFormatConversionException

验证没有';t work on Hibernate Entity';s字段

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

多线程、并发和睡眠未按预期工作

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序

Swagger.io OpenApi v3.0 声明默认媒体类型

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?