16

我希望能够在 Eclipse 中开发时(几乎立即)将代码更改部署到 Tomcat。

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

我还有一个可重新加载的上下文,web.xml作为一个被监视的资源。对此文件的任何编辑/保存都会重新加载我的网络应用程序,只需一秒钟多一点——比构建新的战争文件并完全部署它要快得多。

但是,我想做的是在我编辑任何源文件时触发重新部署。由于 .class 文件正在 Tomcat 中进行修改,看来我只需要监视WEB-INF/classes文件夹及其子文件夹中的任何更改。

我读过我可以在 Tomcat 中添加额外的监视资源,context.xml但这似乎不是我所需要的——除非可以指定一个将被监视的目录(包括递归监视子文件夹和文件)?

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

所以本质上,我的问题是我可以观看整个类文件夹(不包括每个WatchedResource明确)以触发在 Tomcat 中的重新部署吗?

如果不是,我可以将 Eclipse 配置为touchweb.xml 文件,每当我在该项目中保存源文件时?我正在Windows系统上开发。:(


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


更新

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

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

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

另外,我已经阅读了有关docBase为给定上下文设置属性的信息:

docBase="webapps/someExample"

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

4

3 回答 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" />
于 2011-06-16T21:08:50.997 回答
2

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

于 2011-06-13T09:34:04.820 回答
0

尝试我在以下答案中描述的 Spring Loaded JVM 代理: https ://stackoverflow.com/a/37064672/1034436

虽然这适用于我的 Spring Web 应用程序,但它应该适用于 vanilla Eclipse + WTP + Tomcat + Dynamic Web Applications,因为 Spring Loaded 在 JVM/类加载级别上工作。

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

于 2016-05-06T17:54:57.230 回答