使用jpackage打包后如何运行JavaFX应用程序

7

我有一些很菜的问题。 我尝试使用OpenJDK 14中的jpackage为我的测试应用程序创建安装程序。这是我做的:

首先,创建了自定义的JRE:

jlink --module-path "C:\Java\javafx-sdk-14\lib" --add-modules javafx.controls,javafx.fxml --output hello\myjre

这样做成功了。我从 Eclipse 的运行配置中复制了参数,然后使用 jpackage 进行安装。

jpackage --name HelloFX --input hello --main-jar HelloFX.jar --runtime-image hello\myjre

我创建了.msi文件,并运行它,它在我的Win10应用程序中创建了一个条目。当然,我不知道如何在Windows菜单中找到它,但它位于C:\ Program Files \ HelloFX中。我找到了具有Duke图像的图标和应用程序文件,但当我尝试运行应用程序时,会弹出“无法启动JVM”的消息。

有人能帮帮我吗?我真的想让这个工作,并深入研究JavaFX。

1个回答

16
JavaFX SDK中包含的JavaFX JAR文件不包括本地代码。相反,该代码位于bin目录中。这意味着使用jlink创建的自定义运行时映像没有必要的本地代码来运行JavaFX。你有两个选择:从Gluon下载JMOD文件并在创建自定义运行时映像时使用它们,将JMOD文件放在--module-path上而不是常规的JAR文件;或者使用发布到Maven Central的JavaFX JAR文件,这些JAR文件嵌入了本地代码。在两种情况下,请确保为您的操作系统使用JMOD/JAR文件。我认为第一种选择是最好的。使用JMOD文件时,本地代码与自定义运行时映像一起包含在其中,就像特定于JRE的本地代码一样。如果使用第二种方法,本地代码仍将包含在自定义运行时映像中,但必须将其提取到计算机上的某个位置(例如/.openjfx)才能使用。换句话说,第一种选择更加简洁。

1. 请注意,这个提取是由JavaFX自动完成的。


当将JavaFX JMOD目录添加到“--module-path”中时,是否仍需要将JavaFX SDK添加到“--module-path”中? - Hendra Anggrian
不适用于使用 jlink 和/或 jpackage - Slaw
1
关于jmod文档中的一个重要说明:“这种格式是可传输但不可执行的,这意味着您可以在编译时间或链接时间使用它,但不能在运行时使用。” 对我来说,这有些令人困惑。这意味着您可以使用javac编译jmod文件,但是必须将jmod文件链接到一个镜像中,以便从该镜像的java命令中能够使用其中的函数。 - jewelsea
@jewelsea 是的,这会让事情变得有点混乱。我猜想为什么 JMOD 文件不可执行是因为该格式明确允许捆绑本机代码。在编译时,本机代码并不重要;只有 Java 代码才重要。而在链接时,相同的本机代码被提取出来,并放置在内置的本机代码旁边。但是,在运行时使用 JMOD 文件,我认为任何本机代码都必须被提取到某个可写(和可执行?)且可能是特定于平台的位置。我怀疑他们不想定义一种标准的处理方式。 - Slaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接