Java 11/JavaFX 11/Module Deployment Mess(可运行的 Jar,如果单击则有效,但如果从命令行运行则无效)

标签 java javafx

我是 Java11/所有过于复杂的模块内容的新手。

问题

因此,我从 Eclipse 中将我的 Java11/JavaFX11 程序导出为可运行的 JAR。如果我单击 JAR,它运行得非常好(Eclipse 将所有模块设置和 JavaFX 本身自动包含在可运行的 JAR 中)。但是,如果我尝试将 JAR 与 JRE 捆绑在一起并使用以下 BAT 文件通过命令行运行它:

@ECHO 关闭 %~dp0\jre\bin\java -jar javaprogram.jar 暂停

我得到:

错误:缺少 JavaFX 运行时组件,并且需要运行此应用程序 按任意键继续 。 . .

我怎样才能让它像我点击它时那样运行 JAR 文件?

我尝试修复它的方法

最奇怪的是,如果我只使用:

java -jar javaprogram.jar

它只是访问了安装的 JRE,它再次工作。只有当我直接将它指向特定路径上的 JRE 时,它才会出现故障。

或者,我只是将 JavaFX 捆绑在 JRE 旁边,但似乎没有办法用相对路径调用 --module-path完全不相关的东西)。它似乎需要一个确切的路径,如果人们正在下载一个 zip 存档并解压缩它是行不通的。这将是多余的,因为 Eclipse 已经将 JavaFX 与 JAR 打包在一起。我不知道为什么它会因为我从命令行调用它而变得困惑。

项目代码

我正试图让它工作的项目恰好是开源的,所以你可以在这里查看它的代码:

https://github.com/SkyAphid/JDialogue

主类是JDialogueCore。

结束

我不想使用安装程序,因为我认为那太臃肿了。我希望能够像往常一样部署我的软件,只需将它们放在一个可以提取和运行的存档中。

简单地用谷歌搜索问题也很困难,因为由于主题的广泛性,我不断得到完全不相关的结果。非常感谢与此问题相关的任何指导/文档。

感谢您的宝贵时间!

最佳答案

虽然 Java 8、9 和 10 允许 JavaFX Application子类充当程序启动的主类,Java 11 不再是这种情况。将 public static void main 方法放在不同的类中并使该类成为主类可以解决问题. (来源:https://github.com/javafxports/openjdk-jfx/issues/236)

您的命令行调用需要指定 JavaFX jar 文件的位置和 JavaFX native 库的位置。通常它们在 JavaFX SDK 中位于同一位置,但必须以不同的方式指定:jar 文件位于类路径或模块路径中,而 native 库的位置必须在系统属性中指定:

cd /d %~dp0
jre\bin\java -cp javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib com.example.MyNonApplicationClass

如果您在程序中定义了一个 module-info.java,您的 .jar 就是一个模块化的 .jar,您可以从模块的额外安全性中受益:

cd /d %~dp0
jre\bin\java --module-path javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib -m com.example.myapp/com.example.MyNonApplicationClass

如果您的模块化 .jar 文件定义了一个主类,您可以省略类名:

cd /d %~dp0
jre\bin\java --module-path javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib -m com.example.myapp

请注意,相对路径与 --module-path 一起工作得很好。相对路径使用当前目录作为基础。仅通过将%~dp0 放在Java 调用的前面并不会改变当前目录。当前目录是正在运行的命令行或脚本的属性,只能使用 cdpushd 等命令进行更改。

关于Java 11/JavaFX 11/Module Deployment Mess(可运行的 Jar,如果单击则有效,但如果从命令行运行则无效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54609825/

相关文章:

java - 如何在复合 Material (swt)中创建调色板

java - Android 库模块中的 Lambda 表达式不起作用

java - 从 JavaFX 中的非 Controller 类方法调用 Controller 类方法,组合框填充

JavaFx 对 SwingUtilities.invokeLater 的响应

css - 更改属性 jfx 装饰器

java - 使用 Redis 和 MySQL 实现 DAO

java - 如何在java中从 double 组创建char数组?

Java 谷歌地图

java - 如何使代码在后台任务循环内运行一次?

java - 在 JavaFX 中堆叠具有小值的图表