如何在不重新启动整个服务的情况下更新Tomcat Web应用程序?


93

我是新来的Tomcat。我们有一台运行约5个应用程序的开发机。即使是开发人员,在测试过程中我们的客户仍在大量使用它。

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

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

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

谢谢。


将会话管理更改为可持久保存的文件?抱歉无法抗拒:)
rogerdpack

1
@rogerdpack自从六年前我问这个问题以来,我对Tomcat有了很多了解。但是还是谢谢你。
cbmeeks

关于仅类的热插拔,请参见stackoverflow.com/questions/32459047/…–
rogerdpack

Answers:


59

您是否尝试过使用Tomcat的Manager应用程序?它允许您在不关闭Tomcat的情况下取消部署/部署war文件。

如果您不想使用Manager应用程序,还可以从webapps目录中删除war文件,Tomcat将在短时间后取消部署该应用程序。然后,您可以将war文件复制回该目录,然后Tomcat将部署war文件。

如果在Windows上运行Tomcat,则可能需要配置上下文以不锁定各种文件。

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

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

这也是一个很好的建议。直到今天我才听说过经理应用程序。是的,我们使用Windows。我在删除WAR文件并等待时担心的一个问题是,我们的客户经常会期望“小问题”。这些建议是否适用于这种情况?
cbmeeks 2011年

1
@cbmeeks-这取决于这些小修正的发生频率,以及有人注意到的时间。无论哪种情况,都会有少量时间该应用程序不可用。那要花多长时间取决于您的硬件/应用程序。但是它以秒为单位,在我们的应用程序中通常为5-10。但是您的行驶里程可能会有所不同:)
史蒂夫·K

1
哇。自问这个问题以来,我学到了很多东西。是的,我们现在部署Tomcat应用程序时不会完全关闭Tomcat。我所做的一件事是确保所有日志记录(应用程序和Tomcat)都不会在webapps / application文件夹内记录日志。或者,将Tomcat配置为不锁定也可以。因此,我们将日志记录放置在Tomcat文件夹之外的中央位置。像梦一样工作。但是您的回答是最有帮助的。谢谢!
cbmeeks 2013年

5
在重新部署而不重新启动时,您必须小心内存泄漏-很多时候,类加载器会泄漏引用,并且您需要重新启动整个Tomcat进程,才能从应用程序的旧版本中释放内存。LiveRebel(在另一个答案中提到)可以为您实现所有自动化。
Neeme Praks 2013年

3
您无需删除战争即可重新部署。只需复制旧战争,然后等待几秒钟即可。
pepeps 2014年

30

有多种简单的方法。

  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. 通常,tomcat会自动重新部署用新版本覆盖的war文件。如果没有,您可以按照上述说明触摸web.xml。

  3. 已经展开的“目录” 复制到您的webapps文件夹中


1
了解“ touch”方法不会重新加载类很有用。IOW,它不会清除并重新加载Webapp的类加载器层次结构
Rondo

2
看看为什么能奏效$CATALINA_BASE/conf/context.xml。监视WEB-INF / web.xml的更改。可以根据需要在此处轻松列出其他资源。
凯文(Kevin)

21

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


最好使用经理应用程序。对于撞锤而言,这是昂贵的操作。
Sorter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.