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