【问题标题】:Hibernate XML configuration on OpenJ9 (JDK14)OpenJ9 (JDK14) 上的休眠 XML 配置
【发布时间】:2020-09-19 15:56:38
【问题描述】:

我正在尝试在 OpenJ9 (JDK14) 上加载 Hibernate XML 配置,但由于 JAXB 不再是 JDK 的一部分,我收到此错误:

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.ValidationEventHandler

我尝试遵循以下一些答案:How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9,但似乎没有人在 OpenJ9 上运行,并且在尝试包含任何依赖项时出现以下错误:

Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:421)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
    at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:122)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:788)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1081)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276)
    ... 9 more


【问题讨论】:

  • 你尝试使用哪个休眠版本?
  • 我使用的是休眠 5.3.7.Final
  • 链接问题中的哪个解决方案正在使用?使用 maven 指定 jaxb 依赖项的“适当的长期解决方案:(JDK 9 及更高版本)”?你能分享你从有问题的运行中获得的命令行吗?
  • 我尝试了所有建议的不同解决方案,包括 JAXB 模块

标签: java xml hibernate hibernate-mapping openj9


【解决方案1】:

我在拼图中找到了缺失的部分,需要在系统属性中设置javax.xml.bind.JAXBContextFactory

所以解决方案是将 JAXB 添加到依赖项列表中:

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.moxy</artifactId>
            <version>2.7.3</version>
        </dependency>

然后在代码中(或JVM启动时)设置系统属性指向正确的工厂。

    System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

最后,因为我在自定义类加载器中运行,所以必须设置 ContextClassLoader,否则无法找到工厂。

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2010-12-26
    • 2017-07-09
    • 1970-01-01
    • 2011-07-27
    • 2010-11-08
    • 1970-01-01
    • 2012-11-16
    • 2013-12-08
    相关资源
    最近更新 更多