如何将自动更新应用程序从Java Web Start(JDK 8)升级到jlink(JDK 9+)?

48
Java 8及之前版本有Java Web Start,可以在我们更改应用程序时自动更新。Oracle建议用户迁移到jlink,因为这是新的Oracle技术。到目前为止,这听起来很不错。这带来了许多好处:
  1. Windows、Mac和Linux上的本地代码
  2. 代码模块化(虽然Proguard也可以做到这一点)
  3. 使用新的支持技术。
问题:我找不到使用jlink进行自动更新的官方Java解决方案。

如果仅仅是阅读此文档,人们可能会认为Java Web Start仍然可以继续使用。请注意,Java Web Start仍然被显著列出。但是有一个问题:Oracle正在弃用Java Web Start。它计划在JDK 11中移除。那么,官方的前进道路是什么?如果失败了,人们会按照标准方式进行吗?

对于本问题,以下内容不在讨论范围内:

  • 每年向拥有功能丰富的企业解决方案的人支付巨额费用。要分发的应用程序已经打包成一个小于50MB的单个jar文件。
  • 强制用户运行类似InstallShield的应用程序以重新安装新版本,然后每次推送更新时手动卸载旧版本。那太90年代了。
  • 将整个应用程序移植为Web应用程序,重写UI和客户端逻辑以适应浏览器,并处理所有相关的不兼容性。应用程序的作者曾在GWT上工作过,他们非常了解Web浏览器的能力。不幸的是,他们也知道所需的努力程度。
  • 允许用户继续运行旧版本的应用程序。那也太80年代了。现代应用程序更新迅速,支持发布的每个应用程序版本是不可行的。那是我父亲的COBOL应用程序所必须处理的问题,他并不喜欢它。我希望技术已经进步了。
  • 继续使用Java Web Start。除非Oracle改变主意,否则Java Web Start是注定要失败的技术。

2
它不仅“在JDK 11中被删除”,它已经被删除了(因为JDK 11已经发布一周了)。据我所见,jlink允许您创建自包含的运行时映像以进行部署,但它并不提供部署本身,更不用说自动更新功能了。这只是一个服务,Oracle不再提供。 - Holger
2
可能是Oracle不再提供此服务,但这并不妨碍其他人/其他事物做同样的事情... - Henry Crutcher
4
也许你想尝试使用Getdown(https://github.com/threerings/getdown)。使用Getdown,你可以打包并更新你的应用所需的JRE,而无需依赖于已经安装的客户端JRE。请尝试一下。 - dpr
3
没有安装JRE的用户怎么运行Web Start应用程序?使用getdown,您可以将JRE与实际应用程序一起发布。无需在本地安装任何内容。但是,您需要创建包含JRE的捆绑包进行初始部署。 - dpr
3
有一篇文章在https://medium.com/oracledevs/auto-updatable-self-contained-cli-with-java-11-765afb545e52,其中描述了一个过程,并在https://github.com/udaychandra/auto-updater-demo提供了演示。 - Jens Dibbern
显示剩余3条评论
3个回答

2
在2019年5月,评论了OpenWebStart项目。
现在(2019年10月),是时候认真考虑OpenWebStart了。虽然还没有完全实现所有功能,但OpenWebStart的beta版本已经发布,可以在“GPL with Classpath exception”许可证下进行下载。
OpenWebStart的技术细节页面说明:
“OpenWebStart基于Iced-Tea-Web和JSR-56中定义的JNLP规范。它将实现Java Web Start的大多数常用功能,并能够处理任何典型的基于JWS的应用程序。我们计划支持所有未来版本的Java,从Java 11开始。除了Java 11之外,第一个OpenWebStart版本还将支持Java 8。”
该页面进一步说明,OpenWebStart将支持具有自动更新的交互式安装程序和非交互式安装程序。它将支持一些JNLP功能,并包括Java控制面板的替代品。计划功能的更全面列表和实现状态在功能表中提供。
1- 如果您有一个不在OpenWebStart功能列表中的需求(例如jlink支持),您可以联系OpenWebStart团队,并提供适当的激励(例如支付开发人员的费用)来为您实现该功能。他们还为付费客户提供商业版本的软件。
免责声明:我与OpenWebStart项目、公司(Karakun)或项目赞助商无任何关系。这不是推荐。

1
我在过去的项目中遇到过类似的问题。我们需要从Webstart迁移到另一种技术。
第一种方法是安装IcedTea。它直接捆绑在AdoptOpenJDK项目中。
但据我所知,Java不再意味着像这样安装在客户端上,我们也不想与所有客户出现问题。
我们的解决方案是构建一个特定的可执行文件,它连接到服务器,从服务器端请求环境设置,然后下载和提取JLink Java。因此,我们可以使用旧技术,只需将其包装在可执行文件中。
最后一件事情是在调用jnlp-URL时重定向到可执行文件的下载位置。

你用什么来构建可执行文件的?是使用jlink和一组机器,每个操作系统一个?还是其他工具? - Henry Crutcher

1

你使用maven吗?

我用maven解决了类似的问题(我需要更新一个EAR)。

我的主要应用程序(ear包)有一个pom.xml文件,列出了依赖关系和存储库。

这些依赖关系有一个范围(documentation)的<version>标签,就像这个例子一样。

<version>[1.0.0,)</version>

那意味着:获取依赖的1.0.0版本或更新版本。(您也可以将版本设置为上限,[1.0.0,2.0.0),以便在开发新版本时不会在旧应用程序中使用)。
在存储库部分,我添加了我的个人存储库。
现在,在远程机器上,我只需要使用maven重新构建我的ear包:编译器下载我的jar的更新版本并将其组合在一起。
您需要一个系统来检查是否有更新的依赖关系版本,并警告用户更新应用程序,并锁定其工作(如果您不更新,则无法工作)。也许您需要一个小应用程序来使用户轻松进行重建过程。 这是20世纪90年代,但很多桌面应用程序都是这样工作的。 优点
  • 此架构可用于许多不同的项目。
缺点
  • 你需要在远程机器上构建应用程序,因此客户端必须拥有JDK并访问您的存储库(如artifactory���;

  • 您必须在不同的JAR文件中编写代码,并像依赖项一样将它们添加到主要归档文件中。

  • 每次必须更改JAR版本并发布到存储库(这可能是一个好习惯)。


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