将tomcat和eclipse集成为热部署环境
Posted
技术标签:
【中文标题】将tomcat和eclipse集成为热部署环境【英文标题】:Integrating tomcat and eclipse as a hot-deploy environment 【发布时间】:2010-11-03 04:19:27 【问题描述】:我想以集成方式设置 eclipse 和 tomcat,以便对我的 JSP 和 servlet(如果可能)的更改立即反映,而无需部署。
好的,这是在整个互联网上都有很多答案的问题之一,但它们似乎都不同。 (使用 Sysdeo 插件,使用 JBOss 插件,使用过时的 Eclipse 做一些事情,改用 MyEclipse 等),我找不到 1 个明确的资源可供参考。因此,为了我的利益,最简单和最推荐的设置过程是什么?
这假设我有 eclipse 和 tomcat 独立运行。实际上,我已经设法使用此处的说明以非热部署方式将它们集成: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html
Eclipse 版本版本:3.4.2(Ganymede) Tomcat v6.0.20
【问题讨论】:
4 年后,我对它仍然是一个问题的事实感到困惑。来吧,这是非常基本的。 7 年后(差不多),我想我找到了解决方案:***.com/a/37064672/1034436 【参考方案1】:最简单、最快捷:在构建时设置 Eclipse 以生成 WAR 文件;作为构建后的步骤,将该 WAR 文件复制到您的 tomcat webapps 目录中。 Tomcat 将识别更改并刷新站点,而无需部署。请注意,这并不完美。使用该 web 应用程序的用户可能会获得不太理想的体验,因为 Tomcat 会在他们“下”重新启动 web 应用程序;但这确实符合您的要求。
【讨论】:
好的...我想我没有明确表达我的意图。我真的对将应用程序部署给某些用户不感兴趣,但我正在尝试使用 eclipse 运行一个 tomcat 以满足我的日常开发需求并缩短 (make change) -> (See Result) 而不是 (Make更改)-> 部署->(查看结果)【参考方案2】:免责声明:我只是一个快乐的客户,我不为零周转工作,我与他们没有任何关系。
查看JRebel - 它允许您在不重新启动 Web 应用程序的情况下编写代码。它基本上是通过检测你的类并调整它们的变化来工作的。它处理many more cases than hot deploy,包括:
添加/删除方法 添加/删除构造函数 更改界面 添加/删除已实现的接口它是commercial,(pricing details,截至 2018 年 6 月,每年 550 美元),它有很多用于第三方框架的 plugins,包括:
吉斯 春天 支柱 2您可以轻松获得free trial - 我建议您试一试。
【讨论】:
Jrebel,当它起作用时,它就起作用了。如果没有,那就是一场噩梦。一个多星期以来,我一直在他们的支持下打我的头,但我仍然无法让它在我简单的 spring mvc 设置中工作。如果没有我向他们发送我的应用程序或我的应用程序的 helloworld,他们将无济于事。而且,你的价格已经过时了——他们现在收取炸弹。感谢上帝,我只使用了他们的试用版 当前价格为 $365/年/座 现在 550 美元/年/座位【参考方案3】:在您的开发环境中,只需将您的 Tomcat 服务器指向您正在开发它们的任何目录中查找 JSP。保存文件后,您将能够看到更改。
【讨论】:
【参考方案4】:您是否愿意将 Jetty 用于开发目的?
如果是这样,使用 Maven 非常简单 - 只需运行 mvn jetty:run
【讨论】:
【参考方案5】:只需让eclipse直接将class文件写入$TOMCAT/webapps/MyWebApp/WEB_INF/classes目录即可。然后,配置 apache-tomcat 以检查类文件是否已更新,如果有则重新加载它们。
要配置tomcat在类改变时自动重新加载,你需要
编辑$TOMCAT/conf/context.xml
并设置:
<Context reloadable="true">
您可能还需要编辑并重新加载您的 webapps/$YourWebApp/web.xml
文件并包括:
<web-app reloadable="true">
我不记得是否需要这两项更改,但我就是这样配置的 我的 tomcat-6.0.18 自动重新加载。
【讨论】:
根据文档,tomcat.apache.org/tomcat-6.0-doc/config/context.html 他们建议不要在 server.xml 文件中放置Context
元素,但它应该监视 /WEB-INF/classes/ 和 /WEB-INF/lib任何变化。您从哪里了解到 web-app
元素的属性?
对不起,误读了您的答案。 context.xml “应该为每个 Web 应用程序加载”。
如何配置 Eclipse 将类文件写入的位置?【参考方案6】:
这可能不是最好的方法,但它对我有用。
$tomcat/conf/Catalina/localhost/.xml $contextPath/webapp/web/WEB-INF/lib/*.jar $contextPath/webapp/web/ $eclispeWorkbench/project-servlet/src/ $eclispeWorkbench/project-servlet/servlet.jardesc(应该将 jar 导出到 $contextPath 中的 lib 目录) $eclipseWorkbench/project-jsp/我使用 rsync 命令将我的 jsp 项目中的更改同步到 $contextPath。
在 Eclipse 中为 Tomcat 使用远程调试,这将允许有限的代码热交换。如果更改静态字段或添加方法,则需要导出 jar 并重新启动上下文。
【讨论】:
【参考方案7】:将 Eclipse 中的工作区更改为 \tomcat\webapps 由于它仅适用于您的工作,因此应该可以正常工作。您在 Eclipse 中所做的任何更改都在同一目录中,tomcat 会查找要部署的应用程序
【讨论】:
【参考方案8】:如果这只是为了开发,为什么不在 eclipse 中使用集成的 tomcat 服务器呢?您可以在 window->preferences 下配置服务器。配置好后,如果您有一个名为 page.jsp 的 jsp,您可以右键单击它并选择在服务器上运行。在首选项->常规->网络浏览器下,您可以选择天气以使用内置浏览器或外部浏览器。对您的 jsp 进行一些更改,保存并从浏览器刷新您的页面。保存并刷新浏览器后,更改将自动反映。
【讨论】:
【参考方案9】:有两种选择。
首先,Eclipse 允许您执行此操作,只需稍微更改配置(另请参阅detailed post)
将 Tomcat 添加到服务器列表中 将项目设为“动态网络项目”(通过创建向导或通过设置中的构面部分) 将项目添加到tomcat,并配置其“部署程序集” 双击列表中的tomcat打开配置 将“发布”更改为“从不自动发布”(这意味着当您按 ctrl+s 时服务器不会重新启动) 以调试模式启动 tomcat这仍将反映代码更改,但不会重新启动服务器。
第二,我用FileSync plugin很久了:
配置插件以将所有类从 bin 目录发送到您的 tomcat 安装的WEB-INF/classes
(这与配置部署程序集几乎相同)
配置所有其他资源以转到各自的位置
(可选)将文件同步位置设置中的所有绝对路径外部化为单个变量,并在 eclipse 中配置该变量(因此,如果所有成员都使用 eclipse,您也可以提交文件同步设置)
在 eclipse 中将 Tomcat 添加到服务器列表中,将“服务器位置”选项配置为“使用 tomcat 安装”(从服务器列表中双击 tomcat 会打开屏幕)
以调试模式启动 tomcat
这样对我来说非常有效。每个非结构性更改都会立即反映,无需重新部署。
更新: 您可以阅读有关methods for hot-deploying here 的更多信息。 我还 created a project 可以轻松地将工作空间与 servlet 容器同步。
【讨论】:
@VladimirTsvetkov 否 - 这是两个单独的选项 我正在尝试您的第一种方法,但我使用的是 Maven Overlays,当我在其中一个覆盖层中更改文件时,服务器仍会重新启动(覆盖层不是动态 Web 项目,而是动态 Web 模块)。有什么想法吗? 我的印象是,通过将“发布”更改为“从不自动发布”,JSP 在更改时不再重新加载/重新编译。通过在调试模式下启动 Tomcat,类重新加载部分可以正常工作。 我换一种方式:一是改成自动发布;其次,点击服务器配置中的Modules
选项卡,然后点击edit
,取消勾选auto deploy enabled
,我认为这是最简单的方法。 PS:你的第一种方法对我不起作用。
@hiway,服务器配置选项卡中的模块选项卡在哪里?【参考方案10】:
我们可以使用以下选项吗? 双击 Eclipse 中的服务器 -> 服务器位置 -> 使用 tomcat 安装。 它控制tomcat的安装。 java类的变化不需要重启服务器。
【讨论】:
【参考方案11】:在服务器视图中,创建一个新的服务器,不要向服务器添加任何资源(项目)。 双击服务器位置中的服务器。 选择“使用 tomcat 安装”。 将“部署路径”修改为 tomcat 部署目录(例如:c:\server\Tomcat 7.0.14\webapps)。 扩展“发布部分”。 选中“构建事件后自动发布”。 保存并关闭。 从 Eclipse 菜单中选中“项目 -> 自动构建”。 在服务器视图中,右键单击您的服务器,“添加和删除”,发布您的项目。
【讨论】:
【参考方案12】:这里对我有用的是:
context.xml 像这样:
<Context path="/myapp" docBase="myapp" debug="5"
reloadable="false" antiResourceLocking="false" antiJARLocking="true">
<!-- this because i´m using Spring 3.1 with Tomcat -->
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />
</Context>
然后,在 Eclipse 的“服务器”选项卡上,在“模块”选项卡上,我禁用了所有正在部署的模块的“自动重新加载”。
也让默认配置让自动发布。
并且正在使用带有 WTP 的 Maven,不要忘记将 src/main/resources 的内容留在其中,因为 Eclipse 坚持要排除最终构建的此文件夹的内容。
只有通过这一切,我才能使用资源热部署来热部署完整的 (VM) 类!!!
【讨论】:
【参考方案13】:我找到了一个最简单的方法:使用符号链接:我认为这是最快的方法,因为根本没有同步:tomcat 目录和你的项目目录将一直是同一个目录。
Tomcat 会定期检测更改并重新部署您的应用程序。
还有一种方法可以调试您的应用程序,所以我虚心地认为这是一个很好的解决方案。
我已经记录了我的解决方案 here,供任何感兴趣的人参考。
【讨论】:
我能知道为什么需要使用远程 java 应用程序,因为它使用本地主机,这意味着我正在使用自己的本地机器进行调试【参考方案14】:以防万一,你赶时间:
-
在eclipse中的tomcat(其他容器)中勾选“从不自动发布”。
以调试模式启动 tomcat(其他容器)。
瞧! :)
【讨论】:
【参考方案15】:我已经设法使用Spring Loaded JVM 代理在我的开发环境中实现了这个功能。虽然我确实开发了 Spring Web 应用程序,但该项目的描述确实提到它是
可用于任何可在 JVM 上运行的字节码
使用以下设置,我能够将更改自动发布到附加的 Tomcat 实例(通常的 Eclipse WTP 方法)。我正在使用基于 Eclipse Mars.2 (4.5.2) 的 Spring Tool Suite 3.7.3。
-
从他们的Github project 下载 Spring Loaded 的最新版本 JAR。这已经使用 springloaded-1.2.5.RELEASE.jar 进行了测试。
在 Eclipse 中正常设置 Tomcat 服务器(使用 Tomcat 8.0.30 测试)
在 Eclipse 中打开 Tomcat 服务器的配置页面(双击“服务器”选项卡中的服务器实例)。
在“服务器选项”部分,取消选中“默认情况下自动重新加载模块”。
注意:如果您已经将 Web 模块添加到服务器,您可能需要通过“模块”选项卡(位于配置页面窗口底部)单独禁用它们的“自动重新加载”。
在“常规信息”部分,单击“打开启动配置”
在“参数”选项卡中,将以下内容添加到“VM 参数”的末尾:
-javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
要启用 JAR 以及项目的 .class
文件,请根据 this issue's comments 配置 -Dspringloaded=watchJars=
VM 参数。
启动服务器并像往常一样向其发布动态 Web 应用程序项目。同样,我能够使用 Spring Web 应用程序对此进行测试。例如,在我保存文件并且 Eclipse 构建并发布更改的类之后,几乎立即应用了 @Controller 类中的修改代码、添加/减去方法等。最后,Spring Loaded 项目的 FAQ 部分确实提到了一些不会重新加载的情况,因此需要重新启动服务器/应用程序。但这些例外情况要少得多。
另外注意:这不适用于 STS 附带的嵌入式 Pivotal tc Server 或 VMware vFabric tc Server。对于这些服务器,有一个“启用基于 Java 代理的重新加载(实验性)”选项,但它使用的是 Spring Loaded 的旧 1.2.0 版本,这对我不起作用。
【讨论】:
看来你一定要把Spring
带进去,Non Spring
申请怎么样。
虽然您需要为 Tomcat 配置 SpringLoaded JAR,但运行的应用程序本身不需要是 Spring 应用程序(也不包括任何 Spring JAR)。我使用一个简单的单一 HelloWorld Servlet 成功测试了这一点。【参考方案16】:
在 Eclipse 中,单击顶部菜单中的项目并确保选择“自动构建”。这解决了我的问题。我正在使用我的工作区元数据运行带有 Tomcat 的 Eclipse。我还在动态 Web 模块项目中运行 Maven。要进行验证,请将您的应用程序添加到 Tomcat。从 Eclipse 中启动 Tomcat。确保您的应用程序已部署并正在运行。在 Eclipse 中打开控制台选项卡。在您的应用程序中进行更改。几秒钟后,您应该会看到您的更改自动构建并部署到 Tomcat。
【讨论】:
以上是关于将tomcat和eclipse集成为热部署环境的主要内容,如果未能解决你的问题,请参考以下文章
eclipse集成tomcat运行web时提示引入jar包的类找不到的解决办法
使用eclipse maven和tomcat自动部署web项目
eclipse:eclipse for java EE环境下如何配置tomcat服务器,并让tomcat服务器显示在控制台上,将Web应用部署到tomcat中