你没有指定服务器应用程序的类型 - 我将假设你没有运行Web应用程序(因为部署WAR已经执行了你所谈论的事情,并且你很少需要Web应用程序来执行拉取类型更新。如果您正在谈论Web应用程序,以下讨论仍然可以适用 - 您只需为WAR文件而不是单个文件实现更新检查和乒乓球)。
你可能想看看jnlp - WebStart基于此(这是一种客户端应用程序部署技术),但我非常确定它可以定制为服务器类型的应用程序执行更新。无论如何,jnlp在提供描述符方面做得很好,这些描述符可用于下载所需JAR的必需版本...
关于这一点的一些一般想法(我们在同一存储桶中有几个应用程序,并且正在考虑自动更新机制):
考虑使用引导.jar文件,该文件能够在启动应用程序之前读取 jnlp 文件并下载所需/更新的 jar。
即使在应用程序运行时也可以更新JAR文件(至少在Windows上,这是最有可能对正在运行的文件进行锁定的操作系统)。如果您使用的是自定义类装入器,或者您有一堆可能随时装入或卸载的 JAR,则可能会遇到问题,但是如果您创建了防止这种情况的机制,那么覆盖 JAR 然后重新启动应用程序应该足以进行更新。
即使可以覆盖 JAR,你也可能需要考虑对库路径使用一种乒乓球方法(如果你还没有将应用启动器配置为自动读取 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 个以上的文件夹(例如,只需使用 lib-yymmdd 并清除除最新文件夹 5 个文件夹之外的所有文件夹,而不是 ping/pong)。这允许更高级(但更复杂!)的 JAR 回滚。