![](/img/trans.png)
[英]Maven Plugin fails with missing class javax/xml/bind/JAXBException even after adding jaxb-core, jaxb-api, jaxb-impl dependencies
[英]Weird error with JAXB when unmarshalling two XML strings, one succeeds and the other fails with JAXBException: Implementation of JAXB-API not found
我正在开发一个使用 Spring Boot (v.2.7.5) 和 Java 17 构建的项目,该项目必须处理 XML。 它从一大堆 XSD 文件中生成源代码,并使用 API 将 XML 上传到第三方。 它必须使用名称空间等处理 XML 的编组和解组。但这不是问题。
应用程序的一部分是从磁盘中获取文件,解组为 Java 对象,这是生成的类类型之一,然后使用其中一个设置器将一些信息添加到对象,然后是 xml 内容使用 API 上传到第三方。
问题是,当应用程序几乎同时有两个文件要解组时(它们由 Spring Boot 作为单独的计划作业处理,因此它们不在同一个函数或类似的函数中处理)其中一个成功,另一个(第二个在正在处理的订单)抛出异常:
javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
...
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:92)
at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:125)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:230)
这超级奇怪? 如果 JAXB-API 实现不在类路径中,它怎么能成功一次呢?!
该应用程序是使用 Gradle 构建的,build.gradle 包含以下内容:
dependencies {
....
// JAXB
implementation "javax.xml.bind:jaxb-api:2.3.1"
runtimeOnly "com.sun.xml.bind:jaxb-impl:2.3.3"
}
很明显 JAXB-API 的实现在类路径中!
我已经尝试了所有不同的实现,Glassfish、EclipseLink MOXy 等各种版本,都存在相同的问题。
更奇怪的是,当我在我的 IDE 中运行应用程序时,我没有收到此错误。 当应用程序被打包到 Docker 容器中时(它在生产中的 Kubernetes 集群中运行),我得到了它。
有没有人遇到过这样的事情?
事实证明,编组器和解组器对于 JAXB 不是线程安全的,如下所述: https ://javaee.github.io/jaxb-v2/doc/user-guide/ch06.html#d0e6879
我还更新了 jaxb-impl 的 2.3.7 版,这可能对正在解决的问题没有真正的影响,但我想把它扔在那里以防万一。
解决方案是每次都创建一个新的解组器,并在非静态方法中完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.