如何使用Java 11捆绑和启动本机Mac/Windows应用程序?

8
很遗憾,由于其是JavaFX的一部分,因此将在JDK 11中删除javapackager工具。因此,将不再有“官方”的简单方法来创建Mac或Windows的本机Java应用程序包。
我尝试重新使用Java 9/10的javapackager生成的本机启动器文件(在Mac上:my.app/Contents/MacOS/my),它们似乎仍然可以与JDK 11一起使用。但这是一个有点不干净的解决方案。有关如何使用Java 11及更高版本(首选Mac平台)本地打包和启动应用程序的任何想法吗?

2
提出了一种新工具来填补这个空白:https://bugs.openjdk.java.net/browse/JDK-8200758,但它尚未针对特定版本发布。 - Jorn Vernee
是的,我已经看到了那个JEP。所以有必要实现,但是没有快速实现的希望。而且也不确定您是否能够使用OpenJDK打包程序/捆绑器来捆绑Oracle JDK。 - Michael
1
从JDK14开始,您现在可以使用**jpackage**,如此所示:https://stackoverflow.com/a/66511673/191246(尽管仍处于孵化阶段) - ccpizza
2个回答

0

你可以使用 jlink 命令,将你的模块打包成定制化的运行时映像。这与 javapackager 有些不同,需要你使用模块使其正常工作。如果你手动指定了所有所需的 JRE 模块,可能无需使用模块即可使其工作。


你好!我已经使用jlink创建了一个尽可能小的自定义JRE。然而,jlink没有创建本地启动器文件。它有一个启动器选项,但那只是创建一个shell脚本,不能像本地Mac应用程序一样运行(例如,在Dock中显示错误的图标)。然而,javapackager可以创建一个本地启动器文件,通过本地代码启动打包的VM。 - Michael
啊,我明白了。难道OSX应用程序基本上不就是特殊的压缩文件吗?如果是这样,编写一个脚本来打包必要的文件并设置图标等等,不是很容易吗? - apetranzilla
你的原则是正确的。那些.app捆绑包不是压缩文件,而只是特殊的目录结构。手动创建一个确实很容易。然而,关键点在于启动器程序,它必须是本地程序,并且应该启动VM和主类。 - Michael
如果你想尝试一些冒险,写一个启动你的JAR的基本C程序并不难,甚至可以使用GraalVM 的 native-image 工具将JAR编译成ELF二进制文件。 - apetranzilla

0

正如ccpizza在上面评论中提到的:

从JDK14开始,您现在可以使用jpackage,如此展示:stackoverflow.com/a/66511673/191246(尽管仍处于孵化阶段)- ccpizza


为什么这是被接受的答案?我在谷歌搜索Java 11捆绑时发现了这个问题。所提到的答案是关于Java 14的。 - stippi
问题确实是这样说的:“有没有关于如何使用Java 11及更高版本本地打包和启动应用程序的想法”,因此它非常相关。 - h00ligan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接