如何从Java应用程序更新JRE(或运行时映像)?

时间:2018-09-06 02:06:12

标签: java batch-file java-10 jlink

我有一个包含JRE(或jlink文档称为自定义运行时映像),JAR文件和在JRE上运行JAR的方法(bash或批处理文件或exe)的应用程序或.app包)。

我想发送该应用程序的更新(正在运行,我可以连接到我的服务器并下载newJRE.zip和newJAR.jar),但是我不知道用替换当前正在运行的JRE的最佳方法新的JRE。

我尝试将新的JRE解压缩到单独的文件夹中,使用ProcessBuilder在新的JRE上重新启动我的JAR,然后在原始JRE上调用System.exit(),并从新JRE删除旧JRE并复制新的JRE移至原始位置,最后在该JRE上再次重新启动我的应用程序。这不起作用(在Windows上,我还没有在Linux或Mac上尝试过),因为新的,重新启动的JRE似乎在旧JRE中的某些文件上持有文件锁(或句柄?),因此它可以不要删除它们。我还尝试运行一个批处理文件,该文件将删除旧的JRE并将其替换为新的JRE,但是同样,它也无法删除旧的JRE中的所有文件。

这可以用Java完成吗,还是我必须分别为每个平台编写更新逻辑?最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

理论上可行,但在实践中存在障碍。

其中之一是在 Windows 上,只要某些可执行文件正在执行,磁盘上的文件就会被写保护。在 Unix 上,情况并非如此。然而,如果您设法在出现问题之前更新一半的应用程序/JDK,可能会产生奇怪的效果。

我没有真正检查过,但相信所有带有自动更新功能的应用程序实际上都由两个应用程序组成,从而规避了这个问题。其中之一是一个瘦包装器,用于检查更新并安装它们,然后启动真正的应用程序。

如果你想要这个用于 Java 的瘦包装器已经存在并且被称为 WebStart。由于 Java 9 Oracle 不再支持它,但是有 https://openwebstart.com/