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

