在OpenJ9(JDK14)上的Hibernate XML配置

问题描述 投票:0回答:1

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

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

我试着按照一些答案: 如何解决java.lang.NoClassDefFoundError: javaxxmlbindJAXBException 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


java xml hibernate hibernate-mapping openj9
1个回答
0
投票

我找到了谜题中缺少的部分,即 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");

最后因为我是在一个自定义的classloader中运行的,所以我在代码中设置了 ContextClassLoader 必须设置,否则无法找到工厂。

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
© www.soinside.com 2019 - 2024. All rights reserved.