Spring Parent 2.7.18迁3.1.10(Java17)遇JAXB类缺失错误
Spring Boot 3.1.10迁移(Java17)解决JAXBRIContext找不到的问题
问题核心
从Spring Parent 2.7.18升级到3.1.10(Java17)后出现的NoClassDefFoundError: com/sun/xml/bind/api/JAXBRIContext,本质是Spring Boot 3.x全面切换到Jakarta EE API,替代了旧的Java EE(javax.*)API,你尝试的依赖中混合了新旧版本的JAXB/JAX-WS依赖,导致类路径冲突或缺失。
解决方案
1. 清理冲突依赖
先彻底移除pom.xml中所有以下类型的依赖:
javax.xml.bind:jaxb-api(旧Java EE版本)javax.jws:javax.jws-apijavax.xml:jaxrpc-apicom.sun.xml.ws:rt:2.3.1(旧Java EE版本的JAX-WS实现)
这些依赖基于javax命名空间,和Spring Boot 3.x的Jakarta环境完全不兼容,必须删掉。
2. 添加兼容的Jakarta版本依赖
在pom.xml中添加以下适配Jakarta EE的依赖(优先用Spring Parent管理的版本,避免硬写版本号):
<!-- Jakarta JAXB API(Spring Parent已管理对应版本) --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </dependency> <!-- JAXB RI 运行时实现(Jakarta版本) --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <scope>runtime</scope> </dependency> <!-- 如果项目用到JAX-WS(WebService),添加Jakarta版本的实现 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>4.0.2</version> <!-- 适配Jakarta EE 9+的稳定版本 --> </dependency>
3. 验证依赖一致性
执行mvn dependency:tree命令,检查是否还有残留的javax.xml.bind相关依赖,如果有,通过<exclusions>排除掉冲突的依赖。
为什么之前的尝试无效?
你之前添加的javax.xml.bind:jaxb-api和com.sun.xml.ws:rt:2.3.1都是旧Java EE体系的依赖,和Spring Boot 3.x要求的Jakarta API(jakarta.*命名空间)冲突,导致类加载时找不到正确的JAXBRIContext类(该类在Jakarta版本的jaxb-impl中才会被正确加载)。
内容的提问来源于stack exchange,提问作者Rajendra Desale
相关产品推荐
相关产品推荐

