0

我有一个使用 Swing 的 Java 桌面应用程序,我使用 SceneBuilder 在 JavaFX 中重写了它。

Swing 应用程序在所有用户机器(35 机器)上都能正常工作。在 JavaFX 中重写应用程序后,在一台特定的机器上应用程序将无法启动并给出以下错误消息。

我无法弄清楚这个问题。如果有人可以提供任何帮助,我将不胜感激。谢谢你。

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: com/sun/javafx/css/converters/PaintConverter
        at com.jfoenix.controls.JFXPasswordField$StyleableProperties.<clinit>(JFXPasswordField.java:205)
        at com.jfoenix.controls.JFXPasswordField.<init>(JFXPasswordField.java:156)
        at idehmis.controller.LoginController.<init>(LoginController.java:51)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.base/java.lang.Class.newInstance(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(Unknown Source)
        at idehmis.IDEHMIS.start(IDEHMIS.java:30)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(Unknown Source)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: com.sun.javafx.css.converters.PaintConverter
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
4

2 回答 2

1

看起来 JVM 在运行时很难找到com.sun.javafx.css.converters.PaintConverter导致ClassNotFoundException异常错误的位置,这反过来又导致 JFoenix 库抛出java.lang.NoClassDefFoundError意味着在类路径上找不到该类。这表明我们正在尝试加载类定义,并且类不存在于类路径中 ,因此首先确保您拥有 正确的 Java 版本,Java 8以支持 JFoenix,他们确保 JFoenix 库位于您的类路径。

于 2018-02-16T14:37:50.373 回答
0

堆栈跟踪,因为它在每个完全限定的类名(例如java.lang.ClassLoader)前加上模块名(例如java.base),表明机器正在尝试使用 Java 9 运行应用程序。

CSS 转换器类,例如PaintConverter,从 Java 8 及更早版本中的私有 API 提升到 Java 9 中的公共 API。因此该类com.sun.javafx.css.converters.PaintConverter不再存在,并已被javafx.css.converter.PaintConverter. 因此,在 Java 9 中运行您的应用程序时,您会得到一个ClassNotFoundException.

这里的底线是,如果用户更新他们的 JVM,使用任何不公开的 API 或使用这样做的第三方库可能会使您的应用程序失败。这个问题的可能解决方案是:

  • 避免使用私有 API 或使用私有 API 的库
  • 创建和维护适用于特定 JVM 版本的不同版本的代码。对于您使用的第三方 JFoenix 库,Java 9 有一个单独的版本,因此您可以创建使用该版本库的应用程序的 Java 9 版本。请注意,这不仅会给开发人员带来额外的负担,而且还可能给最终用户带来潜在的问题,他们将被迫更新他们使用的应用程序版本,同时更新他们的 JVM。
  • 为您的应用程序创建一个“自包含应用程序包”。这会将特定的 JVM 与您的代码捆绑在一起,因此您基本上可以控制用户用来运行您的应用程序的 JVM。这样做的缺点是您需要为您想要支持的每个平台(Windows 32 位、Windows 64 位、Mac、Linux)创建不同的包,并且应用程序的大小将大幅增加(包括 JVM )。

我通常会在可能的情况下推荐第一个选项,而不是第三个选项。

于 2018-02-16T15:17:11.537 回答