JAXB 问题 w。 Java 11:ClassNotFoundException:jlink 之后的 org.glassfish.jaxb.runtime.v2.ContextFactory

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

我有一个模块化的 Java / JavaFX,都是 Eclipse 中的版本 19 项目。我使用 Maven 来构建项目。该项目使用 JAXB。如果我使用“clean javafx:run”作为目标,该项目在 Eclipse 中运行良好。为了共享该应用程序,我想创建一个可运行的 jar。为了做到这一点,我使用干净的“javafx:jlink”作为目标。从某种程度上来说,这次运行成功了。如果我在 Jlink 映像上启动应用程序,应用程序会启动,但由于 JAXB 失败,它无法读取相关的用户日期:

    jakarta.xml.bind.JAXBException: Implementation of Jakarta XML Binding-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: org.glassfish.jaxb.runtime.v2.ContextFactory]
        at [email protected]/jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:252)
        at [email protected]/jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:240)
        at [email protected]/jakarta.xml.bind.ContextFinder.find(ContextFinder.java:381)
        at [email protected]/jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605)
        at [email protected]/jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:546)
        at [email protected]/de.levin.persistance.Persistance.loadSessions(Persistance.java:49)
        at [email protected]/de.levin.ctrl.MainCtrl.initialize(MainCtrl.java:1005)
        at javafx.fxml@19/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2655)
        at javafx.fxml@19/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml@19/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2516)
        at [email protected]/de.levin.sifuSays.App.start(App.java:125)
        at javafx.graphics@19/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
        at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
        at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at javafx.graphics@19/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
        at javafx.graphics@19/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics@19/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics@19/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
        at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.lang.ClassNotFoundException: org.glassfish.jaxb.runtime.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:521)
        at [email protected]/jakarta.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:113)
        at [email protected]/jakarta.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:146)
        at [email protected]/jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:250)
        ... 19 more

我发现的许多“解决方案”已经有好几年了,并且参考版本 2.3.1。当我尝试使用这些旧版本时,我无法满足有关模块的要求 - 至少我不知道如何修复 module-info.java 可以解决该错误。 无论如何,除了

    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>4.0.0</version>
    </dependency>

我在我的 pom.xml 中尝试了两种不同的实现

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>4.0.3</version>
    </dependency>

并且,根据 Jakarta XML Binding

的推荐
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>4.0.3</version>
        <scope>runtime</scope>
    </dependency>old version.

Jlink镜像的创建基于

        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.8</version>
            <executions>
                <execution>
                    <!-- Default configuration for running -->
                    <!-- Usage: mvn clean javafx:run -->
                    <phase>package</phase>
                    <id>default-cli</id>
                    <configuration>
                        <mainClass>sifuSays/de.levin.sifuSays.App</mainClass>
                        <launcher>launchSifuSays</launcher>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>

总是相同的错误消息。我尝试了几个版本组合,但令我印象深刻的是,错误消息总是指 v2。为了触发构建,我使用“clean javafx:jlink”,所以实际上任何旧的/错误的版本都应该从构建中消失。

知道如何解决这个问题吗? 有趣的是为什么它在 Eclipse IDE 中工作? 也许我需要使用不同的 Java XML 策略重新实现功能?!如果没有合理的方法来修复当前设置,哪种 XML 方法符合使用模块架构的 Java 11?

提前谢谢您。

maven jaxb java-11 java-module
1个回答
0
投票

我会改变

<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>4.0.3</version>
  <scope>runtime</scope>
</dependency>old version.

致:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>4.0.4</version>
    <scope>runtime</scope>
</dependency>

我遇到了同样的错误。我将 impl 上的版本更新为 4.0.4,问题就消失了。我要做的另一件事是删除旧版本这个词。我不确定,但我认为这可能会把事情搞砸。

© www.soinside.com 2019 - 2024. All rights reserved.