我有一个模块化的 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?
提前谢谢您。
我会改变
<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,问题就消失了。我要做的另一件事是删除旧版本这个词。我不确定,但我认为这可能会把事情搞砸。