JAXB(MOXy实现)在Eclipse运行正常,部署或jar包命令行运行报错
该问题和Eclipse环境没有绑定,完全可以在外部环境正常运行,错误本质是运行时classpath/模块路径下缺失JAXB实现,或者配置未正确加载导致的。
报错原文如下:
jakarta.xml.bind.JAXBException: Implementation of Jakarta XML Binding-API has not been found on module path or classpath.
你可以按以下步骤排查解决:
第一,检查打包配置是否包含全部依赖
Eclipse运行时会自动将项目所有编译期依赖加载到运行时classpath,但是直接运行jar包时,默认只会加载jar包内部的文件,如果你打的是不含依赖的瘦jar,自然找不到jakarta.xml.bind-api和eclipselink的实现类。
解决方案:如果是Maven项目,可配置maven-shade-plugin将所有依赖打入同一个可执行jar,示例配置如下:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>替换为你的主类全限定名,比如com.xxx.XmlGenerator</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>如果不想打fatjar,也可以将所有依赖jar放到同一lib目录下,运行时指定全类路径启动:Linux/macOS执行
java -cp 你的jar包.jar:lib/* 主类全限定名,Windows执行java -cp 你的jar包.jar;lib/* 主类全限定名。
如果是部署到Web容器,确认打包后的war包WEB-INF/lib目录下存在jakarta.xml.bind-api和eclipselink的jar包。第二,检查jaxb.properties的加载路径
jaxb.properties必须被打包到类路径根目录,或者和你使用的JAXB实体类处于同一个包路径下才能被正常读取。确认src/main/resources下的jaxb.properties在打包后出现在classes根目录(或者对应实体类的包目录下),如果打包时遗漏了资源文件,也会导致JAXB无法找到MOXy的工厂类, fallback查找默认实现失败抛出该错误。第三,排查依赖版本冲突
你当前使用的jakarta.xml.bind-api 3.0.1和eclipselink 3.0.0大版本兼容,都是基于jakarta命名空间的实现,但若项目中隐式引入了javax命名空间的旧JAXB包,会出现命名空间冲突,导致实现类无法匹配。可执行mvn dependency:tree排查是否存在javax.xml.bind相关的依赖,如有则添加exclusion排除。也可将eclipselink升级到3.0.3以上版本,避免低版本的兼容性bug。第四,Java 9+模块系统适配
如果你使用的是Java 9及以上版本,且项目启用了模块系统(存在module-info.java),需要在module-info.java中添加以下配置:requires jakarta.xml.bind; requires org.eclipse.persistence.moxy;同时运行时确保模块路径包含对应的依赖jar。
内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad

