java - OpenJ9 (JDK14) 上的 Hibernate XML 配置

标签 java xml hibernate hibernate-mapping openj9

我尝试在 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


最佳答案

我发现拼图中缺少的部分,需要在系统属性中设置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());

关于java - OpenJ9 (JDK14) 上的 Hibernate XML 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62130704/

相关文章:

java - NoClassDefFound错误: com/badlogic/gdx/LifecycleListener

java - JPA:如何在运行时指定类对应的表名?

xml - FSharp.Data 类型提供者和反射 : how do I examine the properties of an XmlProvider type?

java - hibernate 5 : Inserting Data

java - 用于 JBoss/分布式应用程序的 JDBC Profiler

java - 如果同时从命令提示符和 main 方法输入参数,谁能告诉我哪些参数将在 Java 中执行?

javascript - innerHTML 与 XML 元素一起使用吗?

php - 在 PHP 中将 XML 片段转换为数组时如何保留 "tag order"?

java - 填充实体后为空下拉列表

java - 1 到 100 之间的偶数(含 1 和 100)