Gradle依赖冲突时解析为低版本问题咨询
问题:Gradle依赖冲突时低版本被解析生效的原因
我原本以为Gradle在依赖冲突时会自动选择最新版本,但在以下依赖树中,发现低版本被解析生效:
org.apache.logging.log4j:log4j-to-slf4j:2.17.2 -> 2.13.3
依赖树详情:
+--- org.springframework.boot:spring-boot-starter-logging:2.6.8 | +--- ch.qos.logback:logback-classic:1.2.11 -> 1.2.3 | | +--- ch.qos.logback:logback-core:1.2.3 | | \--- org.slf4j:slf4j-api:1.7.25 -> 1.7.30 | +--- org.apache.logging.log4j:log4j-to-slf4j:2.17.2 -> 2.13.3 | | +--- org.slf4j:slf4j-api:1.7.25 -> 1.7.30 | | \--- org.apache.logging.log4j:log4j-api:2.13.3 | \--- org.slf4j:jul-to-slf4j:1.7.36 -> 1.7.30 | \--- org.slf4j:slf4j-api:1.7.30
我的build.gradle配置:
plugins { id 'org.springframework.boot' version '2.4.4' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'com.google.cloud.tools.jib' version '2.0.0' id 'java' id 'org.sonarqube' version '3.3' } group = 'com.cox.cns' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } } repositories { mavenCentral() maven { url 'https://repo.spring.io/milestone' } maven { url 'https://repo.spring.io/snapshot' } } dependencies { implementation 'com.oracle.database.jdbc:ojdbc8' implementation group: 'com.jcraft', name: 'jsch', version: '0.1.55' implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.0' implementation 'org.springframework.boot:spring-boot-starter-logging:2.6.8' implementation ('org.springframework.boot:spring-boot-starter-aop'){ exclude group : 'org.springframework.boot' , module:'spring-boot-starter-logging' } implementation 'com.amazonaws:aws-java-sdk-sqs' implementation 'com.amazonaws:amazon-sqs-java-messaging-lib:1.0.8' implementation 'org.springframework.boot:spring-boot-starter-activemq' implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-actuator' developmentOnly 'org.springframework.boot:spring-boot-devtools' implementation 'com.amazonaws:aws-java-sdk-sns:1.11.964' implementation 'com.amazonaws:aws-java-sdk-s3:1.11.851' implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'javax.mail:mail:1.4.7' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' implementation 'org.springframework.cloud:spring-cloud-starter-aws-messaging:2.2.6.RELEASE' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } }
原因分析与解决方案
核心原因:Spring Boot依赖管理插件的版本约束
你引入的io.spring.dependency-management插件会自动应用Spring Boot的BOM(物料清单),这个BOM里预定义了所有Spring Boot官方组件及相关依赖的兼容版本,目的是保证整个依赖生态的稳定性,避免版本不兼容问题。
具体到你的场景:
- 你使用的Spring Boot插件版本是
2.4.4,对应的BOM中,log4j-to-slf4j的指定版本就是2.13.3,logback-classic的指定版本是1.2.3。 - 虽然你手动指定了
spring-boot-starter-logging:2.6.8(这个版本自带log4j-to-slf4j:2.17.2和logback-classic:1.2.11),但依赖管理插件会强制覆盖这些子依赖的版本,优先使用BOM中定义的版本,这就导致了依赖树里的版本降级。
解决方案
有两种方式可以解决这个问题:
统一Spring Boot版本
将Spring Boot插件版本升级到2.6.8,和你引入的spring-boot-starter-logging版本保持一致:plugins { id 'org.springframework.boot' version '2.6.8' id 'io.spring.dependency-management' version '1.0.11.RELEASE' // 其他插件不变 }这样BOM会自动使用2.6.8对应的依赖版本,和你手动引入的starter版本匹配,不会再出现版本降级。
显式覆盖指定依赖版本
如果不想升级Spring Boot整体版本,可以在dependencyManagement块中显式指定你需要的版本,覆盖BOM的默认设置:dependencyManagement { dependencies { dependency 'org.apache.logging.log4j:log4j-to-slf4j:2.17.2' dependency 'ch.qos.logback:logback-classic:1.2.11' } }这样Gradle会优先使用你指定的版本,忽略BOM中的约束。
内容的提问来源于stack exchange,提问作者harsha kumar Reddy
相关产品推荐
相关产品推荐

