jaxb已在java 11中彻底移除,必须迁移到jakarta.xml.bind;maven需替换为jakarta.xml.bind-api和jaxb-runtime依赖,或改用jackson xml等轻量方案。

JAXB 已在 Java 11 中被移除,Java 9 起已标记为废弃,强行使用会触发 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBContext。别再找“JAXB 教程”了——它不是过时,是彻底出局。
为什么 JAXBContext.newInstance() 在 Java 11+ 直接报错
Java SE 9 引入模块系统(JPMS),java.xml.bind 模块被划为“deprecated and removed”。Java 11 彻底删掉该模块,连 rt.jar 或 modules/java.xml.bind 都不存在。
- 即使把 JDK 8 的
jaxb-api.jar手动加到 classpath,也会因反射限制、模块冲突或IllegalAccessError失败 -
javax.xml.bind包名未变,但类已不在运行时可见——这不是 ClassNotFoundException,而是 NoClassDefFoundError,说明类曾被加载过但初始化失败 - Maven 项目若依赖
javax.xml.bind:jaxb-api,必须同时加org.glassfish.jaxb:jaxb-runtime,且版本严格匹配(如 2.3.7 对应 Java 17)
替代方案:用 jakarta.xml.bind 迁移要点
Oracle 将 JAXB 移交给 Eclipse Foundation 后,包名从 javax.xml.bind 升级为 jakarta.xml.bind,这是唯一官方支持的延续路径。
- 替换所有 import:
import javax.xml.bind.JAXBContext→import jakarta.xml.bind.JAXBContext - Maven 依赖改用:
<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>
- 注意:Jakarta EE 9+ 强制包名变更,旧版
javax.*代码无法混用;Spring Boot 3 默认启用 Jakarta XML Bind,但 Spring Boot 2.7 不支持
更轻量的选择:SimpleXML 或 Jackson XML
如果只是做简单对象 ↔ XML 映射,com.fasterxml.jackson.dataformat:jackson-dataformat-xml 更现代、性能更好,且与 Jackson JSON 共享注解体系。
- 无需额外注解,复用
@JsonProperty或@JacksonXmlProperty - 默认不处理
CDATA,需显式配置XmlMapper的setDefaultUseWrapper(false) - 对 namespace 支持弱于 Jakarta JAXB,复杂 Schema 场景慎选
- 常见错误:
Cannot construct instance of X—— 因缺少无参构造函数或字段不可访问,需加@JsonCreator或开放 setter
生成 Java 类仍用 xjc?改用 jaxb2-maven-plugin + Jakarta
如果你靠 xsd 生成 Java 类,原生 xjc 工具在 JDK 11+ 不可用。必须切换构建插件。
立即学习“Java免费学习笔记(深入)”;
- Gradle 用户用
org.jvnet.jaxb2.maven2:jaxb2-maven-plugin,设置<extension>true</extension>并指定jakarta.xml.bind依赖 - Maven 中避免写
<plugin><groupid>com.sun.tools.xjc</groupid></plugin>—— 这是 JDK 内置工具,已消失 - 生成的类会自动带
jakarta.xml.bind.annotation注解,而非javax
jakarta.xml.bind 是底线,而是否继续用 XML 绑定本身,得看业务是否真需要 Schema 校验、命名空间或 WSDL 互操作——很多场景,JSON over HTTP 加 @JacksonXmlRootElement 就够了。










