如何使Java应用程序自我更新?

问题 :我有一个独立的Java应用程序(以下称为“代理”),它作为内部公司服务器上的服务运行。 它充当某些中央服务器的远程代理。 随着代理在更多地方部署,管理它们变得更加复杂。 具体来说:推送更新很痛苦,因为它是一个相当手动的过程,并且访问日志和有关运行代理的环境的其他信息是有问题的,这使得调试变得困难。 正在讨论的服务器无头且无人值守,这意味着这必须是一个完全自动化的过程,无需人工干预,因此Java Web Start不是一个可行的解决方案

建议的解决方案 :定期将代理电话置于家中(到中央服务器)以提供代理状态并检查更新。

我对这个问题的其他建议解决方案持开放态度,但我已经有了一个关于“状态和自我更新”想法的工作原型,这就是这个问题的重点。

我想出的实际上是一个单独的项目,充当代理的包装器。 包装器通过HTTP定期调用中央服务器以检查代理的更新版本。 找到更新后,它会下载新版本,关闭正在运行的代理,然后启动新版本。 如果这似乎是一个奇怪或迂回的解决方案,这里有一些值得注意的其他考虑/约束:

  1. 当包装器获得新版本的代理时,可能会有新的JAR依赖关系,这意味着类路径发生了变化,这意味着我可能想要生成一个单独的Java进程,而不是摆弄ClassLoaders并冒着永久性内存泄漏的风险,需要人工干预 – 正是我想要摆脱的。 这就是为什么我最终得到一个单独的“包装”过程来管理我的原型中的代理更新。
  2. 部署代理程序的某些服务器受资源限制,因此任何解决方案都需要CPU和内存使用率较低。 这让我想要一个不涉及启动新JVM的解决方案,并且不需要单独的包装器进程。
  3. 代理已经部署到Windows和RHEL服务器上,因此解决方案必须是跨平台的,尽管在批处理和bash脚本中复制合理数量的进程以使事情滚动时我没有问题。

问题 :如上所述,我想知道如何制作自我更新的Java应用程序。 更具体地说,是否有任何框架/库可以帮助我解决这个问题? 在这方面有经验的人能给我一些指示吗?

如果您的应用程序是基于OSGi的,您可以让OSGi为您处理捆绑更新。 它类似于您建议的包装器方法,因为OSGi容器本身是“包装器”,其中一些不会更新。 这是对此的讨论

不同的解决方案:使用(并支付)install4j。 在此处查看自动更新function

不需要包装器(保存内存)或java web启动(对应用程序添加更多限制),只需让应用程序中的一个线程定期检查更新(例如从云端)并下载更新(如果可用),然后在您的代码中编写这两个调用应用:

  1. 启动shell脚本( .sh.cmd )以更新工件并在脚本暂停几秒后启动应用程序(以避免同时存在两个应用程序实例)。
  2. 终止您的申请(第一次)

该脚本可以覆盖所需的工件并重新启动您的应用程序。

请享用 !

看看Java Web Start。

从1.5开始,它是Java的一部分技术? 也许1.4? 并允许通过Web浏览器部署和安装独立的基于Java的应用程序。 它还使您能够始终运行最新的应用程序。

http://www.oracle.com/technetwork/java/javase/overview-137531.html

http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29

还看到了这个问题: 为Java Swing应用程序添加自更新function的最佳方法是什么?

似乎Webstart是目前唯一内置的方法。