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
相关产品推荐
相关产品推荐

