对于我的一些项目,我使用 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 选项框中):
- --模块路径“%EXEDIR%\lib”--add-modules javafx.controls,javafx.graphics,javafx.fxml
- --模块路径“./lib”--add-modules javafx.controls,javafx.graphics,javafx.fxml
- --模块路径“\lib”--add-modules javafx.controls,javafx.graphics,javafx.fxml
这个问题可能有一些与我需要的内容无关的细节,但也许其他人也有同样的问题,我想添加它们,以便在得到答案时也能帮助他们。
最佳答案
按照@James_D的建议,我实际上使用了jpackage
而不是Launch4j
更好的是,它不仅可以创建您的 exe 文件,而且还可以通过以特定于平台的格式创建 native 包来消除用户安装 Java 的需要。
话虽如此,这是关于如何使用 Windows 10 操作系统 jpackage
的小指南与 JavaFX 项目。欲了解更多信息,请阅读 documentation 。 jpackage
适用于 macOS 和 Linux,但我使用的是 Windows 10,因此该指南是专门针对它的。
- 前往以下链接(官方)并下载 JavaFX Windows jmods ;
- 对于
jpackage
您还需要下载WiX Toolset ,然后安装它; - 为您的项目创建一个可运行的 Jar。我发现使用 runnable Jar 而不是普通的 jar 更容易,因为您不必稍后指定主类。这是个人偏好,而不是您必须做的;
- 尝试运行
jpackage -h
在命令行/Windows PowerShell 中查看是否jpackage
工作中。如果您收到The term 'jpackage' is not recognize as the name of a 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.graphics,javafx.fxml,javafx.base --win-shortcut --win-menu
- 就我而言,我正在使用我的个人安装程序应用程序,所以运行
jpackage
后我正在做什么,是我正在运行它创建的 exe 文件,然后从它创建的文件夹中,我复制该文件夹中的文件(exe 文件、app 和 runtime 文件夹)并将它们与我的项目的所有其他必需文件一起粘贴到该位置。这样我就可以测试它,如果它有效,我将继续为其创建安装程序,就像我说的,使用我自己的安装程序应用程序。
此命令还有更多可以添加的选项,因此请阅读documentation ,以及运行 jpackage -h
的完整选项列表.
关于使用 Launch4j VM 参数路径包装的 JavaFX 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66873306/