【问题标题】:JDK11/JavaFX: How do I make a fat jar without build/depdency management?JDK 11/JavaFX:如何在没有构建/依赖管理的情况下制作胖 jar?
【发布时间】:2019-08-13 12:05:52
【问题描述】:

我认为不用说我应该能够使用 Oracle 自己的 JDK 和 JavaFX(来自 gluonhq)来构建一个用户可以使用的可分发 jar 文件。

经过详尽的搜索、大量阅读(过去几个月 24 小时或更长时间),最后是这个 Google 搜索查询:

how to make a fat jar -maven -gradle -scala -eclipse -ant -docker -hadoop -netbeans -jerkar -phy -mozni -yogurt -pizza - throwing -python -bacon

我绝对走到了尽头。到底为什么要做这么多工作?我如何构建 JavaFX 应用程序并将其提供给想要实际使用它的人,除了如何使用应用程序本身之外,其他任何事情都不知道?

【问题讨论】:

  • 我认为对于 JDK-11,您应该为此使用 javapackager
  • 但是为什么你不想使用标准的构建工具呢?
  • @Abeltramo 因为使用 oracle 的 Java,我认为我不应该使用开源构建工具来交付我的产品。随时向我介绍 Java 和 JavaFX 的进展情况
  • @OhleC 那很好,但 JDK-11 不存在 javapackager。该工具的最后一个版本是针对 JDK 9 的,它看起来只能在 JDK 14 中重新引入!

标签: java javafx javafx-11 fatjar


【解决方案1】:

MavenGradle 已经回答了几次。构建工具比在命令行上更容易,这不仅仅是因为依赖管理。

由于您专门询问命令行,这里已经记录了一整套说明:https://openjfx.io/openjfx-docs/#modular

非模块化应用

Non-Modular from CLI 部分涵盖了命令行中的 JavaFX 非模块化项目,并为您提供了创建旧经典 fat jar 的全套指令,其中所有依赖项(包括 JavaFX 的依赖项)都捆绑在一起。

有一条注释警告您不要使用此过程:

警告:这是一个令人沮丧的乏味且容易出错的手动过程,应避免使用 Maven 的 shade 插件或 Gradle 的 jar 任务,以防 jlink 不适用。

在你获得 fat jar(它可以是跨平台的)之后,你可以分发它,并且你的用户需要安装并运行 Java:

java -jar myFat.jar 

模块化应用

Modular from CLI 部分涵盖了命令行中的 JavaFX 模块化项目,并在分发方面提到了 jlink 命令的使用,因为它创建了可以发送给用户的自定义图像。它不是一个胖罐子,但它可以让您向您的用户发送一个压缩包,只需解压缩并运行如下:

hellofx/bin/java -m hellofx/hellofx.HelloFX

在这种情况下,您的用户甚至不需要安装 Java。

通过一些额外的工作,您还可以创建一个批处理,这样您就可以运行:

hellofx

但是,如果您仍然想使用模块化应用程序做一个胖罐,您仍然可以应用与非模块化应用程序完全相同的指令。在这种情况下,您可能必须删除 module-info.java 文件,因为此时它真的没有意义。

其他选项

您还有更多选择来分发您的应用程序。

自定义 Java+JavaFX 图像

另一个选项,在同一个文档中,自定义 JDK+JavaFX 映像部分介绍了如何创建您自己的包含 JavaFX 的“JDK”。然后你将像往常一样在 Java 8 中生成你的 jar,你将能够运行它:

/path/to/custom/java -jar myFat.jar

请注意,已经有一些捆绑 JavaFX 的 JDK 发行版,例如 one

jpackage

jpackage 工具还没有,但有一个早期访问:http://jdk.java.net/jpackage/,它使用的是 Java 13-internal。现有的documentation 解释了生成自定义映像或安装程序所需的命令行选项。

请注意,您仍然可以使用 JavaFX 11 或 12。

构建工具

最后,您仍然可以决定使用构建工具(Maven 或 Gradle),这将在很多方面为您提供真正的帮助。请参阅上面的任何链接问题。

【讨论】:

  • 感谢您的热烈响应!我不得不承认 openjfx 的#modular 链接并没有为我做这件事。他们发布了一个在他们的说明中未定义的 mods/ 目录以及一个用于环境变量的无效 SET 命令(至少在 WIndows10 中)。我会听从你的建议并尽快回复这个问题
  • 我已经回复了您与此相关的其他问题。如果要包含模块,我认为将输出文件夹命名为 mods 没有问题。但这取决于您使用它或根据需要命名它。至于“非”功能集,那不应该是,我已经对其进行了测试并且对我来说工作正常,但如果不是,请报告issue
  • 仅供参考,请参阅:JEP 392: Packaging Tool (delivered in JDK 16),“jpackage 工具是由 JEP 343 作为 JDK 14 中的孵化工具引入的。它仍然是 JDK 15 中的孵化工具,以便有时间获得额外的反馈. 它现在已准备好从孵化升级为生产就绪功能(在 JDK 16 中)”。注意,jpackage 的原生打包输出是在可安装的应用程序中,因此与可执行的 jar 不同。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2010-10-04
  • 2014-06-11
相关资源
最近更新 更多