Gradle传递依赖多版本共存问题求助
解决Gradle中jakarta.xml.bind-api版本冲突问题
1. 定位版本被替换的原因
先执行命令查看依赖解析的详细逻辑,找到3.0.1被替换为2.3.3的根因:
./gradlew dependencyInsight --dependency jakarta.xml.bind:jakarta.xml.bind-api --configuration compileClasspath
或者查看完整依赖树:
./gradlew dependencies --configuration compileClasspath | grep -C 5 "jakarta.xml.bind-api"
这能帮你确认是哪个依赖、插件或平台强制锁定了2.3.3版本。
2. 分别处理不同依赖的版本需求
由于jakarta.xml.bind-api:2.3.3使用的是javax.xml.bind包名,而3.0.1使用的是jakarta.xml.bind包名,二者属于不同命名空间,可共存于classpath中。你需要:
- 对需要3.0.1版本的依赖,排除其自带的bind-api,手动引入3.0.1
- 对需要2.3.3版本的依赖,同样排除自带的bind-api,手动引入2.3.3
示例配置:
dependencies { // 依赖A:依赖jakarta.xml.bind-api 3.0.1 implementation('com.example:dep-a:1.0.0') { exclude group: 'jakarta.xml.bind', module: 'jakarta.xml.bind-api' } implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1' // 依赖B:依赖jakarta.xml.bind-api 2.3.3 implementation('com.example:dep-b:2.0.0') { exclude group: 'jakarta.xml.bind', module: 'jakarta.xml.bind-api' } implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.3' }
3. 强制保留双版本(若自动解析仍统一版本)
如果Gradle仍试图合并版本,在build.gradle中配置强制保留两个版本:
configurations.all { resolutionStrategy { force 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.3', 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1' } }
因二者包名不同,强制共存不会引发类冲突,是安全操作。
4. 验证结果
执行命令确认两个版本均存在于依赖树中:
./gradlew dependencies --configuration compileClasspath | grep "jakarta.xml.bind-api"
此时运行项目,需要javax.xml.bind的依赖会匹配2.3.3版本,需要jakarta.xml.bind的依赖会匹配3.0.1版本,ClassNotFound错误应消失。
内容的提问来源于stack exchange,提问作者helion3
相关产品推荐
相关产品推荐

