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

标签 java javafx launch4j openjfx

对于我的一些项目,我使用 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
  • --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 项目。欲了解更多信息,请阅读 documentationjpackage适用于 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 文件、appruntime 文件夹)并将它们与我的项目的所有其他必需文件一起粘贴到该位置。这样我就可以测试它,如果它有效,我将继续为其创建安装程序,就像我说的,使用我自己的安装程序应用程序。

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

    关于使用 Launch4j VM 参数路径包装的 JavaFX 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66873306/

    相关文章:

    java - 将数据从 Excel 传递到 Web 服务

    JavaFX:为多个表的折线图系列提供不同的颜色

    java - 如何用Java从包装好的Jar中提取文件

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

    java - 从 java 代码运行 Launch4J?

    java - 从 Jcombo 中抓取选定的数据

    java - EDT 上的对象创建

    java - 什么是最小的 Java Web MVC 框架?

    javafx - TinyMCE从记事本(剪贴板)复制粘贴到java 1.8上的javafx WebView

    java - ActionEvent 库(JDK 8)无法识别 IntelliJ setOnAction