JVM桌面应用程序的分发


在同一公司内部的几台计算机上分发应用程序不是问题。许多产品可用于自动将文件推送到计算机上。当您需要在不同物理站点之间协调部署时,可能会开始出现问题。

但是,最大的问题是事先不知道计算机的情况:在这种情况下,无法进行推送。因此,二十年前,我们看到了从客户端-服务器架构到基于Web的架构的转变。

剩下的问题是如何部署Java桌面应用程序。在本文中,我们将介绍一些分发此类应用程序的选项。

小程序

尽管不严格涉及桌面应用程序,但我认为在发布Java应用程序的帖子中提到applet是个好主意。

小程序是使Java应用程序远程可用的第一种方法。想法是在Web服务器上托管两个字节码(单个类或JAR),并在HTML页面中引用它。

20210220145133.png 请注意,小程序在客户端运行,因此需要本地JRE。它还要求使用浏览器插件。两者都是安全问题。这导致浏览器供应商取消了对插件的支持,从而使Java团队弃用Java 9中的applet。

随着现代浏览器供应商努力限制或减少其产品中对Flash,Silverlight和Java等插件的支持,依赖Java浏览器插件的应用程序的开发人员需要考虑其他选择。当前依赖浏览器插件的Java开发人员应考虑从Java Applets迁移到无插件的Java Web Start技术。

只要浏览器供应商致力于支持基于标准的插件,就可以在浏览器中支持Java。到2015年末,许多浏览器供应商已经删除或宣布了删除基于标准的插件支持的时间表,同时一些浏览器供应商正在引入专有的浏览器专有扩展API。因此,Oracle计划弃用JDK 9中的Java浏览器插件。

在将来的Java版本TBD中,不推荐使用的插件技术将从Oracle Java开发工具包(JDK)和Java运行时环境(JRE)中完全删除。Java Web Start应用程序不依赖浏览器插件,也不会受到这些更改的影响。

  • oracle.com/technetwork/java/javase/migratin ..

开启网页开始

在applet之后,分发Java应用程序的下一个替代方法是Java Web Start。这是桌面应用程序的规范方法。作为个人说明,我15年前在Java 1.4中使用了它。该页面似乎确认JDK 1.4.2是第一个本地提供的版本,而不是单独下载。但是,Oracle在JDK 9中弃用了Java Web Start,并在JDK 11中将其删除。

这使JWS用户无法选择。Karakun是一家拥有该项目所有权的公司。它以“ Open Web Start”的名称作为单独的软件包提供,并且软件相同。

要通过Open Web Start分发应用程序,除了JAR本身之外,还需要提供JNLP文件。该文件用作某种外部部署描述符。JNLP的功能非常详尽:

  • 在用户的桌面上添加快捷方式
  • 下载后该应用程序是否可以脱机运行
  • 更新政策
  • 本地库的可选列表
  • 等等。

完整的规范仍然可以在Oracle网站上找到。

让我们创建一个JNLP来分发示例Swing应用程序:

20210220144522.png

  1. JAR的路径。
  2. 标记JAR包含主类的标志。
  3. 重命名器应用程序读写文件系统,它需要权限。请注意,权限授予不是细粒度的。另外,权限还要求您签名JAR。
  4. 包含入口点(main方法)的类。

尽管Open Web Start不再作为JDK的一部分提供,但该jpackage工具可用。自JDK 14起已包含它。顾名思义,它jpackage允许您从JAR创建本机安装程序。

它的基本用法很简单:

jpackage--input-jar renamer-swing-1.0.jar #1

假设一个Maven项目在target子文件夹中生成JAR 。 在macOS计算机上,以上命令创建一个RenamerAppKt-1.0.dmg安装程序。它包含一个具有以下结构的macOS应用程序:

jpackage-app-structure.jpg

结构包括:

  1. JAR。
  2. JRE-与jpackage创建安装程序的命令关联的JRE 。
  3. macOS专用文件。 虽然样本JAR为1.5 MB,但由于嵌入式Java运行时,安装程​​序超过50 MB。

jlink

jlink这不是一个真正的分配机制,但我认为仍然值得一提。它允许您使用专用的启动器脚本为应用程序创建自定义运行时。自Java 9以来,它就是JDK的一部分。

从理论上讲,它可以与任何应用程序一起使用,但它在模块化应用程序中很有用。此类应用程序需要描述它们所依赖的模块module-info.java。

主要任务是模块化应用程序。对于我们的示例应用程序,module-info.java文件为:

20210220143124.png

  1. 声明依赖的模块。
  2. Greenrobot库是一个未命名的模块。我们需要通过JAR的名称进行引用。
  3. 允许Greenrobot使用我们的课程。

模块化应用程序非常简单。但是要决定是否将JDK模块放入最终运行时,jlink需要可传递地分析应用程序的每个依赖关系。然而,约35的库%既不模块化也声明Automatic-Module-Name他们MANIFEST.MF

即使该过程容易出错并且很无聊,也可以在构建过程中添加此信息。有关如何实现此目的的描述值得一提。有关更多信息,请查阅此Oracle杂志文章。足以在这里说它大量使用了Moditect Maven插件。

在配置了POM之后,打包Renamer Swing应用程序将产生一个文件夹,其中包含一个可运行的启动器脚本和JDK中的必要模块。

jlink-output.jpg

文件夹大小约为86MB。通过使用gzip,您可以将大小减小到大约30MB,可以分发。

请注意,尽管如此,这将要求用户解压缩归档文件并知道要启动哪个脚本。

其他候选人

这是我在研究此职位时发现的其他一些候选人。请注意,我没有任何经验,但对某些人可能有用。

javapackagerJava 8中引入的Oracle是Java 8javapackager的始祖,jpackage现在已被后者取代。

Java Packager工具可用于从命令行编译,打包,签名和部署Java和JavaFX应用程序。它可以用作Ant任务的替代方案或在IDE中构建应用程序。

FXLauncher既是启动器,也是仅专注于JavaFX应用程序的自动更新器。

FXLauncher是根据Apache License 2.0发布的。

Launch4J:

Launch4j是一个跨平台工具,用于将以jar形式分发的Java应用程序包装在轻量级Windows本机可执行文件中。可执行文件可以配置为搜索某个JRE版本或使用捆绑的版本,并且可以设置运行时选项,例如初始/最大堆大小。如果找不到合适的JRE,则该包装程序还通过应用程序图标,本机JRE之前的初始屏幕和Java下载页面提供了更好的用户体验。

Launch4J是根据BSD 3条款许可发布的,但自2017年以来未见任何发布。

封隔器:

打包您的JAR,资产和JVM,以在Windows,Linux和macOS上分发,添加本机可执行文件以使其看起来像本机应用程序。Packr最适合GUI应用程序,例如使用libGDX制作的游戏。

packr是根据Apache License 2.0发布的。

Install4J:

install4j是功能强大的多平台Java安装程序构建器,可为Java应用程序生成本机安装程序和应用程序启动器。

install4J是专有产品。

结论

在本文中,我们浏览了一些分发Java桌面应用程序的选项:

  • Open Web Start是基于以前的Java Web Start的选项。用户需要在系统上安装软件,以便他们可以执行JNLP文件。值得注意的功能包括自动更新和离线模式。
  • JDK包括jpackage。它允许您创建包装JAR和JRE的安装程序。
  • jlink也包含在JDK中。它无需创建安装程序,而是创建需要打包的自定义发行版。


原文链接:http://codingdict.com/