如何编写可以在运行时自我更新的 Java 应用程序?

新手上路,请多包涵

我想实现一个 java 应用程序(服务器应用程序),它可以从给定的 url 下载新版本(.jar 文件),然后在运行时更新自身。

最好的方法是什么,这可能吗?

我猜应用程序可以下载一个新的 .jar 文件并启动它。但是我应该如何进行切换,例如知道新应用程序何时启动然后退出。或者有更好的方法吗?

原文由 Jonas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

解决方案的基本结构如下:

  • 有一个主循环负责重复加载最新版本的应用程序(如果需要)并启动它。

  • 该应用程序执行其操作,但会定期检查下载 URL。如果它检测到新版本,它会返回到启动器。

您可以通过多种方式实现这一点。例如:

  • 启动程序可以是一个包装器脚本或二进制应用程序,它启动一个新的 JVM 以从被替换的 JAR 文件运行应用程序。

  • 启动器可以是一个 Java 应用程序,它为新的 JAR 创建一个类加载器,加载一个入口点类并调用它的一些方法。如果您这样做,您必须注意类加载器存储泄漏,但这并不困难。 (您只需要确保在重新启动后无法访问具有从 JAR 加载的类的对象。)

外部包装方法的优点是:

  • 你只需要一个 JAR,
  • 您可以替换整个 Java 应用程序,
  • 应用程序创建的任何辅助线程等都将在没有特殊关闭逻辑的情况下消失,并且
  • 您还可以处理从应用程序崩溃等中恢复的问题。

第二种方法需要两个 JAR,但具有以下优点:

  • 该解决方案是纯 Java 且可移植的,
  • 转换会更快,并且
  • 您可以更轻松地在重启时保留状态(模数泄漏问题)。

“最佳”方式取决于您的具体要求。

还应注意的是:

  • 自动更新存在安全风险。通常,如果提供更新的服务器受到威胁,或者如果提供更新的机制容易受到攻击,那么自动更新可能会导致客户端受到威胁。

  • 将对客户端造成损害的更新推送到客户端可能会带来法律风险,并危及您的企业声誉。


如果你能找到一种避免重新发明轮子的方法,那就太好了。请参阅其他答案以获取建议。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 3.0 许可协议

我目前正在开发一个JAVA Linux Daemon,也需要实现一个自动更新机制。我想将我的应用程序限制为一个 jar 文件,并想出了一个简单的解决方案:

将更新应用程序打包到更新本身中。

应用程序:当应用程序检测到更新版本时,它会执行以下操作:

  1. 下载更新 (Zipfile)
  2. 提取 Application 和 ApplicationUpdater (都在 zip 文件中)
  3. 运行更新程序

ApplicationUpdater :当更新程序运行时,它会执行以下操作:

  1. 停止应用程序(在我的例子中是通过 init.d 的守护进程)
  2. 复制下载的jar文件覆盖当前应用
  3. 启动应用程序
  4. 清理。

希望它能帮助别人。

原文由 Berdus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题