使用 Launch4j VM 参数路径包装的 JavaFX 项目

Posted

技术标签:

【中文标题】使用 Launch4j VM 参数路径包装的 JavaFX 项目【英文标题】:JavaFX project wrapped with Launch4j VM arguments path 【发布时间】:2021-06-26 14:37:48 【问题描述】:

对于我的一些项目,我将 JavaFX 用于 GUI,在 JavaFX 被拆分为 OpenJFX 之前,我没有遇到任何问题。现在我想同时使用 JDK 和 JavaFX 的最新版本,因此必须进行一些更改。

在 Eclipse 中工作时,一切正常运行,我将 JavaFX 添加为库,但是当我尝试使用 Launch4j 从可运行 jar 创建 exe 文件时遇到一些问题。在 Eclipse 中,我使用了 2 个 VM 参数:

    --module-path "lib 文件夹路径\" --add-modules javafx.controls,javafx.graphics,javafx.fxml
这是 原因:java.lang.NoClassDefFoundError: javafx/application/Application
    --add-opens javafx.graphics/com.sun.glass.ui=ALL-UNNAMED
这是因为无法访问类 com.sun.glass.ui.Window(在模块 javafx.graphics 中),因为模块 javafx.graphics 不会将 com.sun.glass.ui 导出到未命名的模块

使用第二个参数我没有任何问题,因为它不需要库的路径,但第一个需要,而且我不能简单地使用静态路径(例如:C:\MyAppName \lib) 因为用户可以将应用程序安装在他想要的位置,并且也会有 lib。话虽如此,我可以使用什么作为相对路径,所以 Launch4j 知道该怎么做? lib 文件夹与 exe 位于同一位置。

我尝试了以下但没有运气(我已将它们添加到 JVM 选项框中):

--module-path "%EXEDIR%\lib" --add-modules javafx.controls,javafx.graphics,javafx.fxml --module-path "./lib" --add-modules javafx.controls,javafx.graphics,javafx.fxml --module-path "\lib" --add-modules javafx.controls,javafx.graphics,javafx.fxml

这个问题可能有一些细节可能与我需要的东西无关,但也许其他人也有同样的问题,我想添加它们,以便在我得到答案时也能帮助他们。

【问题讨论】:

您可以只使用 IntelliJ,它比 Eclipse 好得多,并且它带有用于 JavaFX 项目的集成选项。即使对于 JDK 15 (jetbrains.com/idea),它也几乎可以开箱即用(您仍然必须导入库)它还具有出色的调试器,可以帮助您更快地发现代码中的问题,那您为什么使用 Eclipse 让您的生活变得更艰难? 最好的方法是创建一个包含 JVM 的原生包。使用jlink,您可以创建一个包含JavaFX 模块的JVM。 JDK 14 及更高版本中包含的jpackage 工具更进一步,使用“自定义”JVM 创建本机包(因此它本质上结合了jlink 和 Launch4j 的功能。请参阅docs.oracle.com/en/java/javase/14/jpackage/… @James_D jpackage 看起来确实很棒,它可以满足我的需要,唯一的问题是当我尝试使用它时,我得到 “jpackage”一词是未被识别为 cmdlet 的名称。我确实找到了该命令的使用示例,但没有找到如何实际使用它的示例。现在我已经安装了jdk 16 这听起来像是命令不在路径上。 是的,这就是问题所在。我确实在“顶部”PATH 中添加了jdk\bin,但没有添加 int System variables\PATH。现在它确实工作了,但是当我尝试 exe 时,我无法启动 JVM。 【参考方案1】:

按照@James_D 的建议,我实际上使用了jpackage 而不是Launch4j,这样更好,不仅它会创建您的exe 文件,而且它还消除了用户通过创建本机包来安装Java 的需要采用特定于平台的格式。

话虽如此,这是关于如何在 JavaFX 项目中使用 jpackage 的 Windows 10 操作系统的小指南。如需更多信息,请阅读documentation。 jpackage 适用于 macOS 和 Linux,但我使用的是 Windows 10,因此该指南专门针对它。

到以下链接(官方)下载JavaFX Windows jmods; jpackage还需要下载WiX Toolset,并安装; 为您的项目创建一个可运行的 Jar。我发现使用 runnable Jar 而不是普通的 jar 更容易,因为您不必稍后指定主类。这是个人喜好,不是你必须做的; 尝试在命令行/Windows PowerShell 中运行jpackage -h 以查看jpackage 是否正常工作。如果您得到“jpackage”一词未被识别为 cmdlet 的名称,则打开 环境变量 并在 系统变量/路径 中添加Java JDK 中 bin 文件夹的位置。一个简单的方法是在 Windows 搜索栏中搜索 environment,然后选择 Edit the system environment variables,然后选择 Environment variables...强> 之后您可以运行:

jpackage -t exe --name "Name of app" --app-version 1.0 --input "Location of runnable Jar" --dest "Location where the exe will be created" --main-jar "Name of the runnable Jar, with extention .jar at the end" --icon "Complete location where the icon of the app is .ico" --module-path "Location of jmods folder" --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.base --win-shortcut --win-menu

例子:

jpackage -t exe --name "MyApp" --app-version 1.0 --input "D:\Projects\Jars\" --dest "D:\Projects\Executable" --main-jar "Guide.jar" --icon "D:\Projects\Icons\guide.ico" --module-path "D:\Projects\JavaFX\javafx-jmods-16" --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.base --win-shortcut --win-menu

就我而言,我使用的是我的个人安装程序应用程序,所以在运行jpackage 之后我正在运行它创建的 exe 文件,然后从它创建的文件夹中创建一个复制该文件夹中的文件(exe 文件、appruntime 文件夹)并将它们与所有其他必要文件一起粘贴到该位置我的项目。这样我就可以对其进行测试,如果它有效,我将继续为它创建安装程序,就像我说的那样,使用我自己的安装程序应用程序。

此命令有更多选项可供您添加,因此请阅读documentation,并通过运行jpackage -h 查看完整的选项列表。

【讨论】:

【参考方案2】:

就我而言,我将 javafx 放在 jre 目录中,然后 --module-path "jre\jafafx\lib" 获取正确的库:

这是配置:

这是文件树:

【讨论】:

我发现jpackage 对用户来说也更好,因为他们没有下载 Java(所以没有弹出窗口来混淆他们)并进入安装它的过程,甚至虽然这很容易,但最好有一些东西可以避免它并考虑广泛的用户,而不仅仅是一些具有所需知识的用户,而且它只会使应用程序的大小增加大约 82 MB。

以上是关于使用 Launch4j VM 参数路径包装的 JavaFX 项目的主要内容,如果未能解决你的问题,请参考以下文章

launch4j:通过命令行覆盖默认 JVM 堆大小

jar转成exe

如何在 Gradle 中使用带有混淆 jar 的 Launch4J

尝试使用 Alakai 插件将 Launch4j 集成到 Maven 项目中

将 Java 可执行文件(使用 launch4j)固定到 Windows 7 任务栏

Win 7 pin 到任务栏 + launch4j + NSIS