我有两个模块:
base-lib
具有一些Spring Boot / Security依赖性以及一些Azure依赖性。 Azure一个需要特定版本的nimbusds,因此我已将依赖项设置为特定版本(5.64.4)。当我自己构建第一个模块时,gradle仅下载5.64.4。但是,当我将其作为其他模块的项目依赖项(没有其他依赖项)包含在内时,它将下载两个版本:5.64.4和6.0。为什么会有所不同?
基本库:build.gradle
buildscript {
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: "java"
apply plugin: "java-library"
apply plugin: "org.springframework.boot"
apply plugin: "io.spring.dependency-management"
group "${group}"
version "${version}"
sourceCompatibility = 11.0
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
api( [ "com.nimbusds:oauth2-oidc-sdk:5.64.4" ] )
/* These are what pulls in 6.0 */
api( [ "org.springframework.boot:spring-boot-starter-security:${springBootVersion}" ] )
api( [ "org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:${springBootVersion}" ] )
api( [ "org.springframework.security:spring-security-oauth2-client:${springOAuthClientVersion}" ] )
//Microsoft Azure AD
api( [ "com.microsoft.azure:adal4j:${adal4jVersion}" ] )
/* elided, lot's of other dependencies here */
}
服务build.gradle
dependencies {
implementation project(":base-lib")
}
如果我删除第二个模块(service
)并构建第一个模块,则它仅下载5.64.4。但是当我同时拥有它们并构建它们时,它也会拉低6.0。
此问题已解决,但是为什么在作为项目依赖项导入时需要 而不是通常这样做呢?为什么依赖性规则不同?
api( [ "com.nimbusds:oauth2-oidc-sdk:5.64.4" ] ) {
force = true
}
答案 0 :(得分:1)
解决此类问题的最佳方法是对有问题的依赖项使用the dependencyInsight
task。
对于您而言,最可能的解释是您的项目base-lib
使用了Spring Boot和Spring依赖管理插件。这些插件将根据Spring引导BOM强制使用多个版本,但还有一个feature,使使用该版本声明的任何依赖项都将覆盖BOM中的内容。而且由于您指定了oauth2-oidc-sdk
的版本,所以确实可以获取该版本。
现在,当您在service
中传递所有这些依赖项时,将不应用依赖项管理插件。因此,默认的Gradle解析规则适用,这意味着在5.64.4
和6.0
版本之间,Gradle会选择最高的版本。
修复可以通过在尝试时强制使用版本或通过应用相同的插件并再次声明来完成。