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

Java 17.0.3中JAXBContext无法正常工作(Java 11下可运行)

问题:Java 17环境下JAXB XML转JSON报错ClassNotFoundException

问题背景

以下代码在Java 11中可正常将XML文件转换为JSON,但切换到Java 17.0.3后执行报错:

JAXBContext jaxbContext = JAXBContext.newInstance(Instances.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

Instances instances = (Instances) unmarshaller.unmarshal(new File("test.xml"));

return new ResponseEntity<>(new GsonBuilder().setPrettyPrinting().create().toJson(instances), HttpStatus.ACCEPTED);

已添加的Maven依赖:

<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1</version>
</dependency>

报错信息

核心报错:
java.lang.ClassNotFoundException: com.sun.xml.bind.v2.model.annotation.AnnotationReader

完整栈信息片段:

2023-07-14T23:46:57.734+05:30  INFO 96452 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-07-14T23:46:57.736+05:30  INFO 96452 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2023-07-14T23:46:57.800+05:30  INFO 96452 --- [nio-8080-exec-2] c.l.s.s.Service.BackendProcessService    : status reading started
2023-07-14T23:46:57.823+05:30 ERROR 96452 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: com/sun/xml/bind/v2/model/annotation/AnnotationReader] with root cause

java.lang.ClassNotFoundException: com.sun.xml.bind.v2.model.annotation.AnnotationReader
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
    ...(省略部分栈信息)

解决方案

原因分析

Java 9开始将JAXB从JDK核心库中移除,Java 11还保留了部分兼容逻辑,但Java 17完全移除了JAXB的实现类。仅引入jaxb-api(接口定义)和activation不足以运行,必须添加JAXB的具体实现包。

解决步骤

在Maven依赖中添加JAXB的实现包jaxb-impl和jaxb-core,版本与jaxb-api保持一致:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.1</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.1</version>
</dependency>

可选方案(迁移到Jakarta EE)

如果项目允许适配新规范,可替换所有javax依赖为Jakarta版本,更好兼容Java 17及更高版本:

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>4.0.2</version>
    <scope>runtime</scope>
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:50:28