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

问题描述

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

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

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

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

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

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

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

解决方法

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

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

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

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.base --win-shortcut --win-menu

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

您可以向该命令添加更多选项,因此请阅读 documentation 以及运行 jpackage -h 的完整选项列表。