java - 如何使用 JDK 11 打开 JavaFX .jar 文件?
问题描述
我在 IntelliJ 中创建了一个 JavaFX 项目。我可以在 IntelliJ 中运行项目。我在配置中添加了以下代码):
--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml
但是项目的输出 .jar 文件(使用 Artifects 制作)没有运行。我测试了这些命令,但没有任何机会:
java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java --module-path %PATH_TO_FX% --add-modules javafx.controls Timer.jar
命令行的最后一个错误日志:
Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib
ps:在JDK-10上构建时我可以运行这个项目的.jar文件
编辑:
我下载了 JavaFX 并将它的 lib 文件夹添加到系统环境中。为了将 JavaFX 添加到项目中,我执行了以下过程:项目结构 > 库 > 添加 > Java > JavaFxPath/lib
然后我在这个过程中为输出 jar 文件创建了 Artifect:项目结构 > Artifects > Add > JAR > From Modules with dependencies > main Class : main.Main。
解决方案
如果您有一个简单的(非模块化)JavaFX 11 项目(没有 Maven/Gradle 构建工具),并且您正在使用 IntelliJ,就像这里的 HelloFX 示例一样,这就是您可以从 IntelliJ 创建一个可以运行的 jar 的方法控制台
可以在此处找到有关如何运行项目的完整教程,并在此处找到有关如何创建 jar 的说明(请参阅非模块化项目部分),但 IntelliJ 并未涵盖这些内容Artifacts
。
检查 HelloFX 项目是否使用以下 VM 选项从 IntelliJ 运行:
--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml
其中PATH_TO_FX
已设置File -> Settings -> Appearance & Behavior -> Path Variables
,指向 JavaFX SDK库。
半脂罐
我们可以创建一个仅包含项目中的类和第三方依赖项的 Jar,但不包含 JavaFX 依赖项。
转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
,添加您的主要课程,接受。
然后从列表中删除 JavaFX jar,并接受。
构建项目,它将创建一个非常小的 jar(在本例中为 3 KB)。
现在您应该能够像这样运行它:
java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar
(确保它%PATH_TO_FX%
指向一个有效的文件夹,如果它包含空格,则使用引号。
您可以分发此 jar,并在其他平台上运行它,前提是这些平台也具有 JavaFX SDK。
脂肪罐
如果您想要一个包含 JavaFX 依赖项的完整 jar,您仍然可以使用 Artifacts。
转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
,添加您的主要课程,接受。
然后从列表中保留 JavaFX jar,并接受。构建项目。
理论上,您应该能够像这样运行它:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
但这行不通。
原因 1:您需要一个启动器类,如此处所述。
所以创建一个启动器类:
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}
原因 2:如果您只将 SDK jar 添加到 fat jar,您将缺少本机库,如此处所述。
所以编辑工件,选择 Launcher 类作为主类,并添加本机库(Directory Content -> path-to/JavaFX SDK/bin
在 Windows 上):
现在构建项目(现在 jar 大约 33 MB,并且包含不必要的本机库)并运行:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
您可以分发此 jar,但只能分发到 Windows 平台。
如果您下载他们的 JavaFX SDK,您可以为其他平台创建类似的 jar,如果将它们全部添加在一起,您还可以构建跨平台 jar,如上面链接的答案中所述。
无论如何,您应该考虑使用jlink
instead。
笔记
关于这个错误:
引起:java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib
看起来库路径的设置没有引号,并且缺少路径的第一部分C:\Program Files\...
。只要确保你使用引号:
set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"
推荐阅读
- flutter - 这个 Dart 箭头函数怎么会在它的主体中有一个语句呢?
- r - 如何计算具有变化参数的积分并将每个结果记录为R中的序列?
- typescript - ES6 模块导入不适用于 MP3 文件
- ncurses - 有没有办法防止 libcaca 在使用 ncurses 或原始驱动程序时显示闪烁的文本?
- vba - 将表单上的 ListBox 选定值放入报表的文本框中
- swiftui - 在 SwiftUI 中删除 .onDelete 上的弹性顶部动画
- node.js - 在 Dreamhost 上部署 Node.js 服务器
- javascript - 将 Ajax Json 字符串转换为我的 Ajax Get 脚本的 JS 对象
- python - 我如何使硒的响应进入不和谐状态
- javascript - Outlook 的 Office 加载项 - 有时发件人的电子邮件地址变为 LegacyExchangeDN