java - 如何远程更新 Java 应用程序?

标签 java release-management

我们有一个在多台计算机上运行的 Java 服务器应用程序,所有计算机都连接到 Internet,有些在防火墙后面。我们需要从中央站点远程更新 JAR 文件和启动脚本,同时不会明显中断应用程序本身。

该过程必须无人值守且万无一失(即我们无法承受因不合时宜的互联网中断而导致应用程序崩溃的后果)。

过去,我们使用过各种外部脚本和实用程序来处理类似的任务,但由于它们有自己的依赖性,结果更难维护且更难移植。在制作新内容之前,我想听听社区的一些意见。

有没有人已经找到好的解决方案?有任何想法或建议吗?

澄清一下:此应用程序是一个服务器,但不适用于网络应用程序(此处没有网络应用程序容器或 WAR 文件)。它只是一个自治的 Java 程序。

最佳答案

您没有指定服务器应用程序的类型 - 我将假设您没有运行网络应用程序(因为部署 WAR 已经完成了您正在谈论的事情,而且您很少需要网络应用程序来执行拉式更新。如果您谈论的是 Web 应用程序,则以下讨论仍然适用 - 您只需为 WAR 文件而不是单个文件实现更新检查和乒乓球)。

您可能想看看 jnlp - WebStart 是基于此的(这是一种客户端应用程序部署技术),但我很确定它可以针对服务器类型应用程序执行更新进行定制。无论如何,jnlp 在提供可用于下载所需 JAR 的所需版本的描述符方面做得非常好......

对此的一些一般性想法(我们在同一个存储桶中有多个应用程序,并且正在考虑自动更新机制):

  1. 考虑拥有一个能够读取 jnlp 文件并在启动应用程序之前下载所需/更新的 jar 的 bootstrap.jar 文件。

  2. JAR 文件可以甚至在应用程序运行时更新(至少在 Windows 上是这样,而且这是最有可能锁定正在运行的文件的操作系统)。如果您使用自定义类加载器,或者您有一堆可能随时加载或卸载的 JAR,您可能会遇到问题,但如果您创建机制来防止这种情况发生,那么覆盖 JAR 然后重新启动应用程序应该是足以更新。

  3. 即使可以覆盖 JAR,您也可以考虑对您的 lib 路径使用乒乓方法(如果您尚未将应用启动器配置为自动读取目录中的所有 jar 文件lib 文件夹并自动将它们添加到类路径中,那么这就是你真正想要做的事情)。以下是乒乓球的运作方式:

应用启动并查看 lib-ping\version.properties 和 lib-pong\version.properties 并确定哪个更新。假设 lib-ping 有更高版本。启动器搜索 lib-ping*.jar 并在启动期间将这些文件添加到 CP。当你进行更新时,你将 jar 文件下载到 lib-pong(或者如果你想节省带宽并且 JAR 实际上没有改变,则从 lib-ping 复制 jar 文件 - 虽然这很少值得付出努力!)。一旦将所有 JAR 复制到 lib-pong 中,最后要做的就是创建 version.properties 文件(这样可以检测和清除导致部分 lib 文件夹的中断更新)。最后,您重新启动应用程序, Bootstrap 发现 lib-pong 是所需的类路径。

  1. 如上所述的乒乓允许回滚。如果你设计得当,你可以对你的应用程序的一部分进行彻底的测试,然后永远不要更改检查以查看它是否应该回滚给定版本。这样,如果您确实搞砸了并部署了破坏应用程序的东西,您可以使版本无效。这部分应用程序只需从坏的 lib-* 文件夹中删除 version.properties 文件,然后重新启动。保持这部分简单很重要,因为它是您的故障保险。

  2. 您可以拥有 2 个以上的文件夹(例如,除了 ping/pong,只需拥有 lib-yyyymmdd 并清除除最新的 5 个以外的所有文件夹)。这允许更高级(但更复杂!)的 JAR 回滚。

关于java - 如何远程更新 Java 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/125409/

相关文章:

java - 没有参数的 Spring Integration Gateway

.net - 处理具有多个版本的软件的发布管理的最佳方法是什么?

maven-2 - 具有小型且频繁发布的 Maven 项目的版本控制

version-control - 发行说明和变更日志有什么区别?

java - IDE 中的 Release模式与 Debug模式

java - 如果我在 cq5 Web 应用程序中有多个调度程序,谁充当负载均衡器?

java - 使用 Apache Beam 2.9.0 Java SDK 的 Google 数据流作业陷入困境

java - 如何使用 GW EPL 命令和 java 在 TSC 打印机上打印图像

java - Apache Commons HttpClient 是否支持 GZIP?

azure-devops - 是否可以在 VSTS 中触发另一个版本的发布?