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

Spring Boot 3.2 Kotlin项目添加javax.ws.rs-api后遇LinkageError求助

问题分析与解决方案

核心原因

Spring Boot 3.2.1基于**Jakarta EE 9+**规范,原Java EE的javax.*包已全面迁移至jakarta.*命名空间。而你使用的docker-java 3.3.4默认依赖旧Java EE规范下的javax.ws.rs-api,导致类路径中同时存在javax.ws.rs和jakarta.ws.rs两套类,类加载时触发类型转换错误(LinkageError)。

之前强制javax.ws.rs-api版本的思路无效,因为问题本质是命名空间冲突,而非版本不一致。


可行解决方案

方案1:移除JAX-RS依赖,改用HttpClient5传输层

你已经引入了docker-java-transport-httpclient5,这个传输实现不依赖JAX-RS规范,只需排除docker-java自带的JAX-RS传输依赖即可:

修改build.gradle.kts:

dependencies {
    // 其他依赖...
    implementation("com.github.docker-java:docker-java:3.3.4") {
        // 排除默认的JAX-RS传输模块
        exclude(group = "com.github.docker-java", module = "docker-java-transport-jaxrs")
    }
    implementation("com.github.docker-java:docker-java-transport-httpclient5:3.3.4")
    // 删除手动添加的javax.ws.rs-api依赖
}

方案2:升级docker-java至Jakarta兼容版本

docker-java从3.4.0版本开始支持Jakarta EE规范,直接升级即可解决命名空间冲突:

dependencies {
    // 其他依赖...
    implementation("com.github.docker-java:docker-java:3.4.0")
    implementation("com.github.docker-java:docker-java-transport-httpclient5:3.4.0")
}

方案3:依赖替换(兼容旧版docker-java)

如果无法升级docker-java,可通过Gradle的依赖替换功能,将javax.ws.rs-api替换为Jakarta版本:

configurations.all {
    resolutionStrategy {
        dependencySubstitution {
            substitute(module("javax.ws.rs:javax.ws.rs-api"))
                .using(module("jakarta.ws.rs:jakarta.ws.rs-api:3.1.0"))
                .because("Spring Boot 3 使用Jakarta EE替代Java EE")
        }
    }
}

dependencies {
    // 其他依赖...
    implementation("com.github.docker-java:docker-java:3.3.4")
    implementation("com.github.docker-java:docker-java-transport-httpclient5:3.3.4")
}

内容的提问来源于stack exchange,提问作者freak0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:30:04