jdk 8 升级到 openjdk 17 后 javax.xml.bind.jaxbexception 报错,本质是 jaxb 已从 jdk 彻底移除,必须显式引入对应命名空间(javax 或 jakarta)的 api 与实现依赖,且两者版本需严格匹配、不可混用。

JDK 8 升级到 OpenJDK 17 后,javax.xml.bind.JAXBException 或 jakarta.xml.bind.JAXBException 报错,不是依赖漏了就是版本/命名空间没对齐——本质是 JAXB 已彻底脱离 JDK,必须显式声明实现。
确认报错类型是 javax 还是 jakarta
错误栈里出现 javax.xml.bind.JAXBContext,说明代码还在用旧包名;若出现 jakarta.xml.bind.JAXBContext,说明项目或某依赖(如 Spring Boot 3.x)已迁移到 Jakarta EE 9+ 命名空间。两者不能混用:
- Spring Boot 2.x 项目:用
javax.xml.bind+jaxb-api+jaxb-runtime - Spring Boot 3.x 项目:必须用
jakarta.xml.bind+jakarta.xml.bind-api+org.glassfish.jaxb:jaxb-runtime - 混合依赖(如同时引入老版 MyBatis 和新版 Spring Cloud)可能触发类加载冲突,优先统一为 Jakarta 版本
添加正确依赖组合,避免只加 API 不加实现
只加 jakarta.xml.bind-api 会报 Implementation of JAXB-API has not been found on module path or classpath,因为 API 接口没有具体实现类。必须配对引入:
- Spring Boot 2.x(JDK 17 兼容):
<dependency><groupid>javax.xml.bind</groupid><artifactid>jaxb-api</artifactid><version>2.3.1</version></dependency><dependency><groupid>org.glassfish.jaxb</groupid><artifactid>jaxb-runtime</artifactid><version>2.3.10</version></dependency>
- Spring Boot 3.x(强制 Jakarta):
<dependency><groupid>jakarta.xml.bind</groupid><artifactid>jakarta.xml.bind-api</artifactid><version>4.0.0</version></dependency><dependency><groupid>org.glassfish.jaxb</groupid><artifactid>jaxb-runtime</artifactid><version>4.0.3</version></dependency>
- 不要用
com.sun.xml.bind:jaxb-impl(已废弃),也不要混用javax.activation:activation(JDK 17+ 自带java.base中的java.util.Base64)
OSGi、模块化或 Tomcat 环境下额外检查点
在插件化或容器环境中,类加载器隔离会让 JAXB 实现“看不见”:
- OSGi bundle 需显式导出/导入
jakarta.xml.bind包,并确保jaxb-runtime的 Bundle-ClassPath 包含其内部 factory 类(如org.glassfish.jaxb.runtime.v2.ContextFactory) - Tomcat 7/8 用户注意:
catalina.bat中的-Djava.endorsed.dirs参数在 JDK 9+ 已被移除,必须删掉,否则启动直接失败 - Java 17 启动参数中加
--add-modules java.xml.bind是临时 workaround,但不解决模块间可见性问题,且 JDK 17 不再支持该参数(会报错Unrecognized option: --add-modules),别写
最易忽略的是依赖传递污染:某个中间件(如老版 Druid、Fastjson)偷偷带了低版本 jaxb-api,导致运行时加载了无实现的 API jar。用 mvn dependency:tree -Dincludes=jaxb 检查实际参与构建的版本,必要时 <exclusions></exclusions> 掉冲突项。











