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

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

建议的解决方案:使代理定期将电话呼叫总部(到中央服务器),以提供代理状态并检查更新。

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

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

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

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


答案 1

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


答案 2

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


推荐