您如何远程更新的Java应用程序?(How do you remotely update Java

2019-07-31 19:44发布

我们已经得到了在多台计算机,都连接到互联网,一些防火墙后面运行的Java服务器应用程序。 我们需要远离中心的网站上更新JAR文件和启动脚本,没有明显的中断应用程序本身。

该过程必须是无人值守和万无一失(即我们买不起打破应用程序由于不及时互联网中断)。

在过去,我们已经使用各种外部脚本和实用程序来处理类似的任务,而是因为他们有自己的依赖,结果是难以维持且便携性较差。 做一些新的东西之前,我想从社会上一些输入。

有没有人发现这已经是一个很好的解决方案? 有任何意见或建议?

只是为了澄清:这个程序是一个服务器,而不是Web应用程序(Web应用没有容器或WAR文件在这里)。 这只是一个独立的Java程序。

Answer 1:

没有指定的服务器应用程序的类型 - 我会假设你不运行Web应用程序(如部署WAR已经这样做了,你在说什么,你很少需要一个Web应用程序做拉式。更新如果你是在谈论一个web应用程序,下面的讨论中可以仍然适用 - 你只实现了WAR文件,而不是单独的文件更新检查和乒乓球)。

你可能想看看JNLP - 基于此Webstart的(这是一个客户端应用程序部署技术),但我敢肯定,它可以被定制为服务器类型的应用程序进行更新。 无论如何,JNLP确实提供可以用于下载所需的JAR文件的所需版本的描述符的一个不错的工作......

在此方面的总体思路(我们在同一个桶的几个应用程序,并正在考虑一个自动更新机制):

  1. 考虑具有bootstrap.jar文件,是能够读取jnlp文件和下载之前启动所述应用程序所需的/更新的罐子。

  2. JAR文件,甚至可以同时应用程序运行时进行更新(至少在Windows上,这是最有可能持有上运行文件锁定OS)。 你可以,如果你使用自定义的类装载器遇到问题,或者你有一堆可能被加载或在任何时候卸载JAR文件的,但如果你创建机制,以防止这一点,那么覆盖的JAR文件,然后重新启动应用程序应该是足够的更新。

  3. 即使它可能覆盖JAR文件,你可能要考虑一个乒乓方式为你的库路径(如果你不已经配置为自动读取所有jar文件lib文件夹中的应用程序启动器,并将它们添加到自动的类路径,那么这就是你真的想要做的事)。 这里的乒乓球的工作原理:

应用程序启动并着眼于LIB平\ version.properties和lib乒乓\ version.properties,并确定这是较新的。 比方说,LIB平具有更高版本。 该发射器搜索LIB平* .jar和推出过程中添加这些文件到CP。 当你做一个更新,你下载的jar文件到LIB乒乓(或复制LIB平jar文件,如果你想节省带宽和JAR实际上并没有改变 - 这是很不值得的努力,虽然!)。 一旦你复制到LIB乒乓所有JAR文件,你做的最后一件事是创建version.properties文件(这样导致部分lib文件夹中的中断的更新可以检测和清除)。 最后,重新启动应用程序,并引导挑选了LIB乒乓是所需的类路径。

  1. 如上所述乒乓允许回滚。 如果你正确地设计它,你可以有一件您的应用程序,你测试赫克,然后永远不变的检查,看看是否应该回滚给定的版本。 这样,如果你把事情弄糟了和部署的东西,打破了应用程序,你可以无效的版本。 这个应用程序的一部分只是必须从坏lib- *文件夹中删除version.properties文件,然后重新启动。 重要的是保持这一部分污垢简单,因为它是你的故障安全是非常重要的。

  2. 你可以有2页以上的文件夹(而不是平/乒乓球,只是有LIB-YYYYMMDD并清除所有但最新的5,例如)。 这使得JAR文件的更先进的(但更复杂!)回滚。



Answer 2:

你一定要看看OSGi的,它的创建只是为这种情况下(特别是嵌入式产品),并且使用了大量的公司。 您可以更新罐子“捆绑”,添加和删除它们,应用程序运行时。 我没有用它自己,所以我不知道的开源框架/服务器的质量,但这里是一堆有用的链接,让你开始:

http://www.osgi.org/Main/HomePage
http://www.aqute.biz/Code/Bnd
http://blog.springsource.com/2008/02/18/creating-osgi-bundles/
http://blog.springsource.com/
http://www.knopflerfish.org/
http://felix.apache.org/site/index.html



Answer 3:

我建议Capistrano的多服务器部署。 虽然它是专为部署Rails应用,我已经看到了它成功地用于部署Java应用程序。

链接: Capistrano的2.0不只是为Rails



Answer 4:

而JVM是在它上面运行的罐子不能被修改,并会导致错误。 我曾尝试类似的任务,最好的我想出了正在更新的罐子和过渡副本的启动脚本来看看那个罐子。 一旦你有了更新的罐,启动它,并等待对旧瓶子给它的信号,这样做后结束。 不幸的是,这意味着一秒钟,但大多数序列化的结构中的Java GUI等的损失很容易与目前的GUI可以实际关闭之前被转移到更新的应用程序(有些事情可能不是序列化虽然!)。



Answer 5:

这是很难做出更新原子,特别是如果你有任何数据库更新做。

但是,如果你不这样做,你可以做的是首先确保你的应用程序可以从一个相对路径运行。 也就是说,你可以把你的应用程序在某些目录中,所有重要的文件都相对于该位置发现,让你的实际安装位​​置并不重要。

接下来,复制安装。 现在,你有“跑”的版本,你有“新”版本。

更新使用任何高科技你喜欢(FTP,rsync的,纸带,不管你的船浮筒)的“新”版本。

验证安装(校验和,快速的单元测试,你需要什么 - 如果你喜欢,甚至启动了一个测试端口)。

当你很高兴与新的安装,下来,原本运行的情况下,重命名原始目录(MV应用application_old),重命名新目录(MV application_new应用程序),并重新启动它。

您的停机时间减少到服务器关闭和启动时间(自命名为“自由”)。

如果偶然,你发现一个严重的错误,你有你的原始版本仍然存在。 停止新的服务器,将其重命名,重新启动旧。 非常快速回落。

另一个好处是,你的服务基础架构是静态的(像你的rc脚本,cron作业等),因为它们指向“程序”目录,它不会改变。

它也可以用软链接,而不是重命名的目录来完成。 无论哪种方式是好的。

但技术简单,和近防弹如果你的应用合作。

现在,如果你有DB的变化,好,这是完全不同的讨厌的问题。 理想的情况是,如果你可以让你的数据库的更改“向后兼容”,然后希望老版本的应用程序可以在新架构上运行,但是这并不总是可行的。



Answer 6:

我相信,如果你使用像一个基于OSGi的应用服务器,你可以热部署JAR文件SpringSource的DM服务器 。 我从来没有用它自己,但我们知道春天投资组合的质量一般,我敢肯定,这是值得一试。



Answer 7:

我们使用Eclipse的OSGi其中的更新系统,我们的经验是非常好的。

推荐的!



Answer 8:

Java Web Start的最新版本允许注入在本地缓存中的应用程序,而无需实际调用程序,它可以被标记为“脱机”。 由于高速缓存是什么是用于调用程序,它将只在下次运行更新。 对于这个工作,你很可能需要在他们的名字(比如我们的库 - 2009-06-01.jar)与版本号罐。



文章来源: How do you remotely update Java applications?