java - 构建和运行 JavaFX .jar 文件时出现问题
问题描述
我很难让我的 JavaFX 应用程序在我的 IDE 之外运行。我正在使用 IntelliJ IDEA 2019.3,并使用 openjdk-12 进行编译。JavaFX sdk 的版本是 11.0.2,我使用外部库 jfoenix-9.0.8 和 jSerialComm-2.6.0。操作系统是 Windows 10,安装了 JDK 14,我能够运行使用命令行以相同方式构建的非 JavaFX 应用程序java -jar name.jar
。当我尝试从命令行运行 mu JavaFX .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:222)
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$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:832)
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.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$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:832)
据我所知,所有必需的库都包含在 .jar 中,我跟踪了多个线程并尝试了多种方法,但我总是卡住了,因为我对构建 Java .jar-s 还是很陌生。
还尝试了openjfx官方页面上的以下教程,由于外部库,我在尝试以模块化和非模块化方式编译我的应用程序时遇到了问题。
dir /s /b src\*.java > sources.txt & javac --module-path %PATH_TO_FX%;%PATH_TO_FOENIX% --add-modules=javafx.controls --add-modules=javafx.fxml --add-modules=jfoenix-9.0.8.jar --add-modules=jSerialComm-2.6.0.jar --add-modules=javafx.graphics -d out @sources.txt & del sources.txt
在 Win cmd 中使用此命令出现错误:
error: bad name in value for --add-modules option: 'jfoenix-9.0.8.jar'
error: bad name in value for --add-modules option: 'jSerialComm-2.6.0.jar'
按照教程将 PATH_TO_FX 设置为正确的位置,并将 PATH_TO_FOENIX 设置为使用外部库 .jar-s 的位置。在库名称末尾也没有“.jar”的情况下尝试了此命令。
当我在与模块对应的文件夹中创建 module-info.java 时,我实际上可以使用命令编译它:
dir /s /b src\*.java > sources.txt & javac --module-path %PATH_TO_FX%;%PATH_TO_FOENIX% -d mods/LA_GUI @sources.txt
但后来我得到错误:
Error: Module javafx.fxml not found, required by LA.GUI
当我尝试使用 jlink 构建图像时。openjfx 的示例提供非常简单,所以我可能会在这里省略一些内容。就是这样。尝试在 Intellij 中添加对 Maven 的框架支持,但是 Maven 在查找不同的包时遇到了问题,并且在每次解决尝试运行 Maven 测试的错误之后,都会出现另一个错误,所以我放弃了它,因为我以前从未使用过它,也不知道我是否可以让它工作,如果使用 Maven 生成的 .jar 与我现在拥有的有什么不同..
旁注:我从笔记本电脑中删除了最新的 JRE,因为当我尝试通过 运行 hello world 程序时java -jar name.jar
,它说该文件是使用比当前 java 可以运行的新版本编译的,这在我下载 LATEST JRE 时没有任何意义。现在,我拥有 JDK 14 的所有与 Java 相关的变量和可运行文件,它可以很好地运行基本的 Java 程序,但如果没有上述错误,我似乎无法让它运行我的 JavaFX .jar。我会换成其他适合构建 GUI 应用程序的编程语言,或者使用 Java Swing 之类的,但是我有不到一个月的时间来完成这个项目,而且我负担不起从以前没有使用过的东西重新开始......
编辑:这是我尝试运行的 .jar 文件内容的屏幕截图: .jar 文件内容
解决方案
I experienced error messages by following the example from OpenJFX. I found if I swapped the order from (--module-path --add-modules) to (--add-modules --module-path), I was able to make it work. Also, I had to provide the full address of the module-path versus using the environment variable. Hope that gives you some ideas.
推荐阅读
- apache-kafka - 应用程序处于活动状态但一段时间后停止使用消息
- php - 如何将数字作为数组传递 - Guzzle
- go - 如何使用 cursor.ReadDocument() 从 arangodb 读取任意对象
- excel - 如何解决 VBA“[TFS Excel 加载项 CommandBarButton] 的方法执行失败”运行时错误
- java - 使用 Datavec 变换滞后值
- java - 正确处理 gRPC 服务器运行时异常
- javascript - 如何通过 onclick 事件将数据附加到 localStorage 项目?
- firebase - Firestore 集合组查询解决方案?
- angular - Kendo UI Angular 文件上传组件因大文件而失败
- java - 片段 onClick 调用方法