我们有一个Java服务器应用程序,该应用程序可以在许多计算机上运行,所有计算机都连接到Internet,其中一些位于防火墙后面。我们需要从一个中央站点远程更新JAR文件和启动脚本,而不会明显中断应用程序本身。
该过程必须无人值守且万无一失(即,由于不及时的互联网中断,我们无法中断应用程序)。
过去,我们使用各种外部脚本和实用程序来处理类似的任务,但是由于它们具有自己的依赖性,因此难以维护且移植性较差。在提出新的东西之前,我希望获得社区的一些意见。
有人找到了一个好的解决方案吗?有任何想法或建议吗?
需要说明的是:此应用是服务器,但不适用于Web应用(此处没有webapp容器或WAR文件)。 它只是一个自治的Java程序。
您没有指定服务器应用程序的类型- 我将假设您没有在运行Web应用程序(因为部署WAR已经完成了您所谈论的内容,并且您很少需要Web应用程序来执行拉类型如果您正在谈论一个Web应用程序,那么下面的讨论仍然可以适用- 您只需为WAR文件而不是单个文件实施更新检查和乒乓球)。
您可能想看看jnlp- WebStart基于此(这是一种客户端应用程序部署技术),但是我很确定它可以针对服务器类型应用程序执行更新而定制。无论如何,jnlp在提供可用于下载所需JAR的所需版本的描述符方面做得非常好。
对此有一些一般性的想法(我们在同一个存储桶中有多个应用程序,并且正在考虑自动更新机制):
在启动应用程序之前,请考虑具有bootstrap.jar文件,该文件能够读取jnlp文件并下载所需/更新的jar。
即使在应用程序运行时(至少在Windows上,这也是操作系统最有可能对正在运行的文件进行锁定的操作系统), 都 可以更新JAR文件。如果您使用自定义类加载器,或者随时都有可能加载或卸载一堆JAR,则可能会遇到问题,但是如果您要创建防止这种情况的机制,则应覆盖JAR,然后重新启动该应用足以进行更新。
即使有可能覆盖JAR,您也可能需要考虑使用lib路径的乒乓方法(如果尚未将应用启动器配置为自动读取lib文件夹中的所有jar文件并将其添加到类路径,那么那是您真正想要做的事情)。乒乓球的工作方式如下:
应用程序启动并查看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文件夹的中断更新)。最后,您重新启动该应用程序,然后引导程序选择lib- pong是所需的类路径。
如上所述的乒乓允许回滚。如果您设计正确,则可以在自己的应用程序中进行测试,然后再进行更改以检查它是否应回滚给定版本。这样,如果您搞砸了并部署了破坏应用程序的内容,则可以使版本无效。应用程序的这一部分只需要从错误的lib- *文件夹中删除version.properties文件,然后重新启动即可。重要的是要使这部分污物简单,因为这是您的故障保护。
您可以拥有2个以上的文件夹(例如,代替ping / pong,仅拥有lib-yyyymmdd并清除除最新的5个文件夹之外的所有文件夹)。这允许更高级(但更复杂!)的JAR回滚。