You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:03:10