如何解决 "Graphics Device initialization failed for : d3d, sw" when 运行 a java Jar file with JavaFx

How to solve "Graphics Device initialization failed for : d3d, sw" when running a java Jar file with JavaFx

大家下午好。

当我尝试 运行 我的 Java 代码作为可运行的 Jar 文件时遇到问题。我正在使用 Eclipse 并创建了一个普通的 Java 项目。我将 JavaFX 罐子作为用户库包括在内。当我用 IDE 启动程序时,程序 运行 没有问题。为了创建 Jar 文件,我在 Runnable Jar 文件中使用 Java 项目的导出构建。 当我检查 "Extract required libaries into generated JAR" 和 运行 时,我收到此错误消息:

Error: JavaFX runtime components are missing, and are required to run this application

当我检查 "Package required libaries into generated JAR" 和 运行 时,我收到此错误消息:

Graphics Device initialization failed for :  d3d, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
        at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)
        at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:244)
        at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:260)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)
        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
        ... 1 more
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
Caused by: java.lang.RuntimeException: No toolkit found
        at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:272)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:835)

有谁知道,为什么我不能 运行 JAR 但在 IDE 中它 运行 正常?

我按照此处的文档安装了 JavaFX https://openjfx.io/openjfx-docs/

检查您构建的 jar 文件清单文件以查看其依赖项。将有一个名为 Class-path 的变量: 您可以通过右键单击 jar 文件并使用 winrar 或普通资源管理器打开 META.INF 如果它们都以 libs/ 开头,则在您构建的 jar 文件所在的位置创建一个 libs 文件夹,并将所有 javafx 指定的 jar 文件复制到该文件夹​​中,然后执行

我找到了解决问题的方法。当我将库导出到生成的 Jar 中时,我得到了 JavaFX 运行时组件丢失的错误。我现在想起来我之前在 Eclipse 中遇到了同样的错误,尽管代码中没有错误并且我使用了 JavaFX 元素。但是要启动它并 运行ning 我必须添加 VM 参数。所以当我想 运行 程序时,我只需要在命令提示符中写这个。

假设您已经在构建 Jar 文件的目录中:

java --module-path "C:\Path\to\javafx-sdk-13.0.2\lib" --add-modules javafx.controls,javafx.fxml -jar YourJar.jar

它现在对我有用。希望对其他人也有帮助。

祝福