Tomcat和Eclipse零停机部署

16

我希望能够在Eclipse中开发时,能够将代码更改快速部署到Tomcat(几乎瞬间完成)。

到目前为止,我的Eclipse输出已将构建的类放置在Web应用程序的WEB-INF/classes文件夹中。

我还有一个可重新加载的上下文,将web.xml作为监视资源。对此文件进行任何编辑/保存都会重新加载我的Web应用程序,只需一秒多一点的时间 - 比完全构建新的war文件并部署它要快得多。

然而,我想做的是在编辑任何源文件时触发重新部署。由于.class文件正在Tomcat中被修改,因此似乎我只需要监视WEB-INF/classes文件夹及其子文件夹中的任何更改即可。

我已经阅读过可以在Tomcat的context.xml中添加其他监视资源,但这似乎不是我所需要的 - 除非可以指定要监视的目录(包括递归监视子文件夹和文件)?

<Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/someother.file</WatchedResource>
  <Manager pathname=""/>
</Context>

因此,我的问题基本上是,我是否可以观看整个classes文件夹(而不需要显式包括每个WatchedResource),以触发Tomcat的重新部署?
如果不能,我能否配置Eclipse在保存该项目中的源文件时“touch”web.xml文件?我正在Windows系统上开发。 :(

PS我对JRebel产品不感兴趣。任何答案都应该是免费的解决方案。


更新

根据Tomcat文档的说明,应通过将上下文设置为可重新加载来监视classes文件夹:

如果要让Catalina监视/WEB-INF/classes/和/WEB-INF/lib中的类以进行更改,并在检测到更改时自动重新加载Web应用程序,则设置为true。

只有对web.xml的更改似乎会触发重新加载。 这是一个错误还是我的设置不正确?

此外,我已经阅读了有关为给定上下文设置docBase属性的内容:

docBase="webapps/someExample"

这似乎接近我所需的,因为我可以快速在Eclipse中重新发布。我的唯一问题是,我需要同时在同一端口上运行几个Web应用程序/ servlets。
3个回答

5
对于这些情况,我将eclipse构建输出设置为WEB-INF/classes,就像您所做的那样,并创建一个上下文文件,其中docBase设置为项目中webapp文件夹(WEB-INF的父文件夹)。这个文件需要手动放置在conf/Catalina/localhost中(假设一些元素的server.xml使用默认配置)。最终结果是tomcat从开发目录提供服务。因此,更改servlet或其他类,它会更新到classes文件夹中。保存jsp文件后,它会立即生效。
如果项目结构如下:
src
|-main
  |-webapp
    |-images
    |-js
    |-WEB-INF
      |-jsp
      |-classes

然后上下文就会像这样:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/path" reloadable="true" 
    docBase="<pathtoproject>/src/main/webapp" />

你知道是否有任何方法可以在Tomcat中运行多个Web应用程序来完成这个任务吗?(只需要一个应用程序在“构建输出”路径中) - Michael
我不确定我理解你的意思。您是否有多个独立的Web项目,希望在开发过程中以相同的方式运行?还是,您有多个Web项目正在使用相同的共享库,并且希望将共享库编译到Web项目类文件夹中?如果这些项目是独立的,则每个项目只需要一个上下文文件(将文件命名为<path>.xml)。如果项目使用相同的共享代码,并且您希望将其编译到Web类文件夹中,则我不确定该如何操作。 - philwb
我有多个Web应用程序,它们必须在同一个Tomcat实例中运行 - 我不需要它们具有相同的“热部署”行为。 - Michael
不应该是问题。您可以使用多个上下文文件进行创建和部署,或者您应该能够使用 WTP 来处理您不想要这种“热部署”的上下文,并仅在需要时使用此上下文。哦,如果您正在使用此上下文,请勿使用 WTP 发布相同的应用程序。 - philwb

2
也许启用自动重新部署的Eclipse Web Tools Project可以帮助您?添加服务器,打开属性,在发布下面您会看到一个单选按钮,上面写着“当资源更改时自动发布”。这将导致重新部署(如果类发生更改),否则只会覆盖资源。您可以通过内置的更新站点(仅适用于Eclipse)安装WTP,因此请检查您的软件更新。它对大多数服务器是免费的,但不支持某些Websphere功能。

我已经在使用WTP了。完整重新发布我的项目需要几分钟时间,这就是我想要避免的。 - Michael
是因为重新部署需要这么长时间吗?我的意思是,Servlet上下文重启和缓存预热(Spring等)需要时间。或者是什么占用了这么多时间? - toomasr
由于有很多类和文件,Eclipse中的构建需要很长时间来清理和重新发布。如果我在进行修改时修改类,然后只需重新加载上下文,这会快得多。另外,请查看我的更新。谢谢。 - Michael
docBase的更改是在conf/context.xml中进行的吗?reloadable也是在同一文件中完成的吗?你能发布那个文件吗? - toomasr
我还没有进行docBase更改,只是稍微了解了一下,但没有找到任何深入的文档。 - Michael

0

尝试使用我在以下答案中描述的Spring Loaded JVM代理程序: https://dev59.com/93NA5IYBdhLWcg3wWsUA#37064672

虽然这对我的Spring Web应用程序有效,但是这也适用于普通的Eclipse + WTP + Tomcat +动态Web应用程序,因为Spring Loaded在JVM /类加载级别上工作。

您仍然需要像@toomasr在他的答案中提到的那样使用“资源更改时自动发布”。但是,您还必须禁用“默认情况下模块自动重新加载”选项。如果您已经将模块从Eclipse发布到Tomcat,则需要为每个Web模块禁用“自动重新加载”(通过Tomcat配置页面的“模块”选项卡)。这应该可以防止Tomcat在更新单个类文件时重新加载应用程序,这可能是所有重新加载/等待时间的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接