【问题标题】:How do I update a Tomcat webapp without restarting the entire service?如何在不重新启动整个服务的情况下更新 Tomcat webapp?
【发布时间】:2011-09-28 20:04:28
【问题描述】:

我是Tomcat 的新手。我们有一台运行着大约 5 个应用程序的开发机器。尽管它是开发版,但我们的客户在测试期间大量使用它。

假设我们需要对一个类文件进行一点小改动。现在,我们必须关闭 Tomcat(影响其他四个应用程序),删除 WAR 文件(和 web 应用程序目录),重新部署新的 WAR 文件并重新启动 Tomcat

当然,这会让一些人感到不安,因为它会破坏所有应用的所有登录会话。

有没有更好的方法来做到这一点?我的意思是,有没有办法只重新加载已更改的 CLASS 而不是开发机器上的所有内容?

谢谢。

【问题讨论】:

  • 将您的会话管理更改为持久保存到文件的内容?抱歉无法抗拒:)
  • @rogerdpack 自从六年前提出这个问题以来,我对 Tomcat 有了很多了解。不过还是谢谢。
  • 关于类的热交换,见stackoverflow.com/questions/32459047/…

标签: tomcat deployment war


【解决方案1】:

您是否尝试过使用Tomcat's Manager application?它允许您在不关闭 Tomcat 的情况下取消部署/部署战争文件。

如果你不想使用Manager应用,你也可以从webapps目录下删除war文件,Tomcat会在短时间内取消部署应用。然后,您可以将战争文件复制回目录中,Tomcat 将部署该战争文件。

如果您在 Windows 上运行 Tomcat,您可能需要 configure 您的 Context 以不锁定各种文件。

如果您绝对不能有任何停机时间,您可能需要查看Tomcat 7's Parallel deployments 您可以同时部署具有相同上下文路径的 Web 应用程序的多个版本。用于将请求匹配到上下文版本的规则如下:

  • 如果请求中没有会话信息,请使用最新版本。
  • 如果请求中存在会话信息,请检查每个版本的会话管理器是否有匹配的会话,如果找到,请使用该版本。
  • 如果请求中存在会话信息但找不到匹配的会话,请使用最新版本。

【讨论】:

  • 这也是个好建议。直到今天我才听说过经理应用程序。是的,我们使用 Windows。我对删除 WAR 文件并等待的一个担忧是我们的客户经常期待“小修复”。这些建议适用于那种情况吗?
  • @cbmeeks - 这取决于这些小修复发生的频率,以及多久有人注意到。在任何一种情况下,都会有一小段时间应用程序不可用。这取决于您的硬件/应用程序该时间有多长。但它以秒为单位,我会说在我们的应用程序中通常是 5-10。但是您的里程可能会有所不同:)
  • 哇。自从我提出这个问题以来,我学到了很多东西。是的,我们现在部署 Tomcat 应用程序而不会完全关闭 Tomcat。我做的一件事是确保所有日志记录(应用程序和 Tomcat)不会在 webapps/application 文件夹内记录日志。或者,将 Tomcat 配置为不锁定也可以。因此,我们将日志记录放在 Tomcat 文件夹之外的中心位置。像梦一样工作。但你的回答是最有帮助的。谢谢!
  • 在不重启的情况下重新部署时,您必须小心内存泄漏 - 类加载器经常会泄漏引用,您需要重新启动整个 Tomcat 进程才能从旧版本的应用程序。 LiveRebel(在另一个答案中提到)可以为您自动化所有这些。
  • 您无需删除战争即可重新部署。只需复制旧战争并等待几秒钟。
【解决方案2】:

有多种简单的方法。

  1. 只需触摸任何 web 应用的 web.xml。

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

您也可以更新 WEB-INF/lib 中的特定 jar 文件,然后触摸 web.xml,而不是构建整个 war 文件并再次部署它。

  1. 删除webapps/YOUR_WEB_APP目录,Tomcat会在5秒内开始部署war(假设你的war文件还在webapps文件夹中)。

  2. 通常用新版本覆盖war文件会被tomcat自动重新部署。如果没有,您可以按照上面的说明触摸 web.xml。

  3. Copy 在您的 webapps 文件夹中已经展开的“目录”

【讨论】:

  • 知道 'touch' 方法不会重新加载类很有用。 IOW,它不会清除和重新加载 webapp 的类加载器层次结构
  • 了解为什么可以在$CATALINA_BASE/conf/context.xml 中阅读。监视 WEB-INF/web.xml 的变化。其他资源可以根据需要轻松列出。
【解决方案3】:

在 apache tomcat 的 conf 目录下,你可以找到 context.xml 文件。在那个编辑标签中作为 Context reloadable="true">。这应该可以解决问题,您无需重新启动服务器

【讨论】:

  • 首选管理器应用程序。这对 ram 来说是一项昂贵的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多