2

我通过 ArchLinux 上的 IDE IntelliJ IDEA 创建了一个 javafx 应用程序。现在,我想在没有任何 IDE 的情况下启动这个程序,所以我创建了一个 .jar 文件。尝试使用 java -jar myprogram.jar 启动程序时,我收到错误消息,即缺少 javafx 的运行时组件。很好 - 我将使用 --module-path 选项添加这些,它会运行。

但是,这个 --module-path 东西只有在我将模块路径设置在 /lib/...并在那里设置模块路径,找不到模块。

我的问题是我想在一个文件夹中“自包含”所有可能的内容,这样我就可以在安装了 JVM 的另一台机器上复制和粘贴所有内容并运行它,并且不想依赖于特定路径javafx 模块已安装。也许除了自定义 --module-path 之外还有另一种方法?

有什么帮助吗?谢谢 :-)

4

2 回答 2

1

可以多个自定义模块路径放入命令 --module-path。重要的是要真正放入所需模块的完整路径,包括模块本身的文件名。例如,假设我想包含模块 module1.jar 和 module2.jar 来执行 MyApplication.jar,并且所有这些文件都放在同一个文件夹中,比如 /my/custom/folder。然后命令行命令将如下所示:

java -jar --module-path /my/custom/folder/module1.jar:/my/custom/folder/module2.jar --add-modules module1,module2 MyApplication.jar
于 2022-01-06T20:03:07.090 回答
1

忘记尝试创建一个包含 JavaFX 组件并依赖于预安装 JVM 的可执行 jar(它不是受支持的配置)。

但是,cwellm's answer here详细介绍了一种方法,通过将JavaFX模块保留在添加到模块路径的单独jar中,将模块化JavaFX依赖项与创建的应用程序jar分开,我相信这可能是一个有效且受支持的部署配置。它确实需要在正确的位置将多个 jar 文件部署到客户端才能正常工作。另一种选择是假设一个 JDK 的发行版,例如 liberica 或 corretto,它可以与基本 JDK 发行版中包含的 JavaFX 一起提供,那么您不需要为 JavaFX 指定模块路径,因为它已经存在于默认值中JDK 的引导模块路径。

推荐解决方案

而是使用 jlink 创建运行时映像,这可以通过(以及其他方法)使用openjfx maven 插件来完成。

或者,如果您想要安装程序,请使用 jpackage,它也可以(以及其他方法)使用 maven 创建,请参阅JPackageScriptFX作为示例。

jpackage 不创建 archlinux 原生包。所以如果你想要那个,那么 jpackage 就不会被使用。相反,您可以使用 maven 程序集或 tar 调用来创建 jlink 输出的 zip 或 tar.gz,或者使用 pacman 工具创建相同的原生 archlinux 包。

或者,如果您喜欢 gradle,请查看badass jlink 和运行时插件

使用构建工具(maven 或 gradle)包含 JavaFX 依赖项而不是依赖 JavaFX sdk 下载是首选 IMO。此外,如果可能,定义一个模块信息。然后 jlink 可用于从您的应用程序创建所需的运行时,它的依赖项和 jre,以及应用程序的执行脚本,从而使事情是自包含的。由 jpackage 创建的 rpm 或 deb 格式的本机包更进一步。安装以这种方式打包的应用程序还可以确保所有必需的操作系统库依赖项都是正确的。

如果您想了解更多信息,请参阅此答案中的上下文信息(FAQ 部分):

于 2022-01-05T08:09:17.550 回答