Java 9/10迁移后docx4j报JAXBException问题求助
解决Java 9/10下docx4j报
javax/xml/bind/JAXBException的问题 我之前在把docx4j的代码从Java 8迁到Java 11的时候也踩过这个坑!原因很简单:Java 9开始引入了模块化系统,JAXB(Java Architecture for XML Binding)相关的包不再默认包含在JDK中了,所以运行时会找不到javax.xml.bind.JAXBException这个类。你加了Moxy但没解决,大概率是没配全依赖或者没考虑模块化的问题,给你几个可行的解决步骤:
1. 先升级docx4j到兼容Java 9+的版本
旧版本的docx4j可能没适配Java 9的模块化机制,建议直接升级到docx4j 8.x及以上版本,这个版本开始对Java 9+的支持更完善,能减少不少兼容性问题。
2. 添加JAXB相关依赖(Maven/Gradle)
Java 9+需要手动引入JAXB的API和实现,分两种情况配置:
用默认JAXB实现
直接在pom.xml里添加以下依赖:
<!-- JAXB API 核心包 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- JAXB 具体实现 --> <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.0.1</version> </dependency> <!-- JAXB依赖的Activation API --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
用Moxy作为JAXB实现
如果你坚持用Moxy,就替换上面的jaxb-impl和jaxb-core为Moxy的依赖:
<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.7.9</version> </dependency>
3. 模块化项目额外配置(如果使用module-info.java)
如果你的项目是Java模块化项目,还需要在module-info.java里添加对JAXB相关模块的依赖:
module your.project.module { // 引入JAXB API模块 requires javax.xml.bind; // 如果用Moxy,引入Moxy模块 requires org.eclipse.persistence.moxy; // 引入Activation模块 requires java.activation; // 引入docx4j的模块(根据你用的docx4j版本调整) requires org.docx4j; }
4. 临时应急方案(不推荐长期使用)
如果只是想快速验证代码,也可以在IntelliJ IDEA的运行配置里添加VM参数,强制引入JAXB相关模块:
--add-modules java.xml.bind,java.activation
不过这个方案只是临时绕过问题,长期来看还是推荐用依赖的方式从根源解决。
按照这个步骤来,应该就能解决NoClassDefFoundError的问题了。我当时就是先升级了docx4j,再补全JAXB依赖就搞定了。
内容的提问来源于stack exchange,提问作者Yuuuucef
相关产品推荐
相关产品推荐

