如何编写可以在运行时自行更新的 Java 应用程序?
我想实现一个java应用程序(服务器应用程序),它可以从给定的url下载新版本(.jar文件),然后在运行时自我更新。
最好的方法是什么,是否可能?
我猜该应用程序可以下载一个新的.jar文件并启动它。但是我应该如何进行切换,例如,知道新应用程序何时启动然后退出。还是有更好的方法来做到这一点?
我想实现一个java应用程序(服务器应用程序),它可以从给定的url下载新版本(.jar文件),然后在运行时自我更新。
最好的方法是什么,是否可能?
我猜该应用程序可以下载一个新的.jar文件并启动它。但是我应该如何进行切换,例如,知道新应用程序何时启动然后退出。还是有更好的方法来做到这一点?
解决方案的基本结构如下:
有一个主循环负责重复加载应用程序的最新版本(如果需要)并启动它。
应用程序执行其操作,但会定期检查下载 URL。如果它检测到新版本,它将退出到启动器。
您可以通过多种方式实现这一点。例如:
启动器可以是包装脚本或二进制应用程序,它启动新的 JVM 以从被替换的 JAR 文件运行应用程序。
启动器可以是一个 Java 应用程序,它为新的 JAR 创建一个类装入器,加载一个入口点类,并在其上调用一些方法。如果这样做,则必须注意类加载器存储泄漏,但这并不困难。(您只需要确保在重新启动后,任何从 JAR 加载的类的对象都无法访问。
外部包装器方法的优点是:
第二种方法需要两个 JAR,但具有以下优点:
“最佳”方式取决于您的具体要求。
还应该指出的是:
自动更新存在安全风险。通常,如果提供更新的服务器受到威胁,或者提供更新的机制容易受到攻击,则自动更新可能会导致客户端受到威胁。
向客户端推送对客户端造成损害的更新可能会带来法律风险,并会给您的业务声誉带来风险。
如果你能找到一种方法来避免重新发明轮子,那就太好了。有关建议,请参阅其他答案。
我目前正在开发一个JAVA Linux守护进程,并且还需要实现一个自动更新机制。我想将我的应用程序限制为一个jar文件,并提出了一个简单的解决方案:
将更新程序应用程序打包到更新本身中。
应用程序:当应用程序检测到较新版本时,它会执行以下操作:
应用程序更新程序:当更新程序运行时,它会执行以下操作:
希望它能帮助别人。