【问题标题】:Customizing --module-path for Java为 Java 定制 --module-path
【发布时间】:2022-01-07 05:07:43
【问题描述】:

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

但是,只有当我将模块路径设置在 /lib/... jar 文件并在那里设置模块路径,找不到模块。

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

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

【问题讨论】:

    标签: java javafx module-path


    【解决方案1】:

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

    java -jar --module-path /my/custom/folder/module1.jar:/my/custom/folder/module2.jar --add-modules module1,module2 MyApplication.jar
    

    【讨论】:

    • 如果您的应用程序所依赖的模块的所有 jar 都放在my/custom/folder 中,那么您可以只指定父文件夹名称而无需列出每个单独的 jar,例如只提供--module-path /my/custom/folder 应该可以工作,但您仍然需要显式添加模块--add-modules module1,module2
    • 我还推荐-jar 作为最后一个选项,例如-jar MyApplication.jar,尽管我想如果您尝试过它并且它与 -jar 作为早期选项一起使用它可能没问题,但它似乎与将其他 VM 选项放在 -jar 参数之前的 documented syntax 不匹配。
    【解决方案2】:

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

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

    推荐的解决方案

    可以使用openjfx maven plugin(以及其他方法)代替create a runtime image using jlink

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

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

    或者,如果您喜欢 gradle,请参阅 badass jlink and runtime plugins

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

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

    【讨论】:

    • 感谢您的提示。我想出了如何以“我的”方式去做(见下面的答案),但你的绝对是更清洁的方式,所以我会检查一下!只是想指出,第一个链接指向一个可能错误的目的地。
    • 谢谢,我编辑了答案以更新有关运行时映像创建的 openjfx 站点文档的链接,并指出您提供的模块路径解决方案是一个有效的替代方案。
    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 2018-09-07
    • 1970-01-01
    • 2018-11-05
    • 2018-03-06
    • 2012-05-02
    相关资源
    最近更新 更多