我希望能够将代码更改部署到Tomcat(即将推出),而我正在使用Eclipse进行开发。
到目前为止,我有Eclipse的输出,将构建的类放在我的Web应用程序的WEB-INF/classes
文件夹中。
我还有一个可重新加载的上下文,web.xml
作为监视资源。任何编辑/保存到此文件 重新加载我的网络应用程序,只需一秒钟 - 比构建新的war文件并完全部署它要快得多。
但是,我想要做的是在编辑任何源文件时触发重新部署。由于在Tomcat中修改.class文件,我似乎只需要监视WEB-INF/classes
文件夹及其子项中的任何更改。
我已经读过,我可以在Tomcat的context.xml
中添加额外的监视资源,但这似乎不是我需要的 - 除非可以指定一个将被监视的目录(包括递归监视sub文件夹和文件)?
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/someother.file</WatchedResource>
<Manager pathname=""/>
</Context>
基本上,我的问题是我可以观察整个类文件夹(没有明确地包括每个WatchedResource
)来触发Tomcat中的重新部署吗?
如果没有,每当我在该项目中保存源文件时,是否可以将Eclipse配置为touch
web.xml文件?我正在开发Windows系统。 :(
PS我对JRebel产品不感兴趣。任何答案都应该是免费解决方案。
更新
根据Tomcat documentation,应该通过将上下文设置为reloadable来监视classes文件夹:
如果你想要Catalina,请设置为true 监视/ WEB-INF / classes /中的类 和/ WEB-INF / lib进行更改,以及 自动重新加载网络 如果检测到更改,则应用程序。
只有对web.xml的更改才会触发重新加载。这是一个错误还是我的设置不正确?
另外,我已经阅读了有关为给定上下文设置docBase
属性的信息:
docBase="webapps/someExample"
这似乎接近我的需要,因为我可以在Eclipse中快速重新发布。我唯一的问题是我需要在同一端口等同时在Tomcat中运行多个web应用程序/ servlet。
答案 0 :(得分: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" />
答案 1 :(得分:2)
也许启用了自动重新部署的Eclipse Web Tools项目会对您有所帮助吗?添加服务器,打开属性,在发布下,您将看到一个单选按钮,说“资源更改时自动发布”。如果类更改,这将导致重新部署,否则只会覆盖资源。您可以通过内置更新站点(仅限Eclipse)安装WTP,因此请查看您的软件更新。它对大多数服务器是免费的,但它不支持某些Websphere功能吗?
答案 2 :(得分:0)
尝试我在以下答案中描述的Spring Loaded JVM代理: https://stackoverflow.com/a/37064672/1034436
虽然这对我的Spring Web应用程序起作用,但由于Spring Loaded在JVM /类加载级别上工作,因此它应该与vanilla Eclipse + WTP + Tomcat + Dynamic Web Applications一起使用。
你仍然需要使用@toomasr在他的回答中提到的“资源更改时自动发布”。 但,您还必须禁用“默认情况下自动重新加载模块”选项。如果您已经将Eclipse中的模块添加/发布到Tomcat,则为每个Web模块禁用“Auto Reload”(通过Tomcat配置页面的Modules选项卡)。这应该可以防止Tomcat在更新单个类文件时重新加载应用程序,我怀疑这是所有重新加载/等待的时间。