【发布时间】:2020-05-08 21:15:57
【问题描述】:
为什么 Gradle 将我的库的传递依赖更改为更新版本?如何让它停止?
详情
我正在为我的公司开发一个使用 Spring Security 的内部插件库。该插件显式声明了对最新版本 Spring Security 4 的依赖:
compile ('org.springframework.security:spring-security-core:4.2.13.RELEASE') {
force = true
}
当我在客户端项目中包含插件时,Gradle 正在将我从 spring security 4 升级到 5,这会破坏插件。
compile 'com.mycompany:my-security-plugin:0.3.0-SNAPSHOT'
这是客户端项目中dependencyInsight的输出:
> Task :dependencyInsight
org.springframework.security:spring-security-core:5.1.6.RELEASE (selected by rule)
variant "compile" [
org.gradle.status = release (not requested)
org.gradle.usage = java-api
org.gradle.component.category = library (not requested)
]
org.springframework.security:spring-security-core:5.1.6.RELEASE
+--- org.springframework.security:spring-security-config:5.1.6.RELEASE
| \--- com.mycompany:my-security-plugin:0.3.0-SNAPSHOT:20200122.162056-4 (requested org.springframework.security:spring-security-config:4.2.13.RELEASE)
| \--- compileClasspath
\--- org.springframework.security:spring-security-web:5.1.6.RELEASE
\--- com.mycompany:my-security-plugin:0.3.0-SNAPSHOT:20200122.162056-4 (requested org.springframework.security:spring-security-web:4.2.13.RELEASE) (*)
org.springframework.security:spring-security-core:4.2.13.RELEASE -> 5.1.6.RELEASE
\--- com.mycompany:my-security-plugin:0.3.0-SNAPSHOT:20200122.162056-4
\--- compileClasspath
在我看来,在所有情况下,我都在我的配置中请求 spring security 4。我做错了什么?
我正在使用 Gradle 5.1.1。
更新
作为一种解决方法,可以让客户端应用程序使用特定版本声明对 Spring Security 的直接依赖。如果可能的话,我会尽量避免这种情况。
更新 2
gradlew dependencyInsight --dependency org.springframework.security:spring-security-web 的输出:
> Task :dependencyInsight
org.springframework.security:spring-security-web:5.1.6.RELEASE (selected by rule)
variant "compile" [
org.gradle.status = release (not requested)
org.gradle.usage = java-api
org.gradle.component.category = library (not requested)
]
org.springframework.security:spring-security-web:4.2.13.RELEASE -> 5.1.6.RELEASE
\--- com.mycompany:my-security-plugin:0.3.0-SNAPSHOT:20200122.162056-4
\--- compileClasspath
更新 3
buildEnvironment 通过 grails 包括以下内容:
+--- org.springframework.boot:spring-boot-gradle-plugin:2.1.9.RELEASE
| | +--- org.springframework.boot:spring-boot-loader-tools:2.1.9.RELEASE (*)
| | +--- io.spring.gradle:dependency-management-plugin:1.0.8.RELEASE
【问题讨论】:
-
其他东西似乎正在引入
org.springframework.security:spring-security-web:5.1.6.RELEASE(我从(*)猜测作为提示),这反过来可能会引入org.springframework.security:spring-security-core:5.1.6.RELEASE,这会导致省略您的lib 依赖项。你能在org.springframework.security:spring-security-web:5.1.6.RELEASE上执行dependencyInsight并发布输出吗? -
发布了输出。谢谢
-
显然您的插件正在使用较新的 Spring Security 版本的项目中使用。强制使用您的 Spring 安全版本将破坏该项目。该项目必须降级其依赖项,或者您必须在您的项目中升级它们(或使它们与两个版本的 Spring Security 一起工作)!。
标签: gradle spring-security grails-4