将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 jee tomcat 集成 结合 项目部署

eclipse集成tomcat运行web时提示引入jar包的类找不到的解决办法

eclipse_project

eclipse-maven集成tomcat7热部署项目

使用eclipse maven和tomcat自动部署web项目

eclipse:eclipse for java EE环境下如何配置tomcat服务器,并让tomcat服务器显示在控制台上,将Web应用部署到tomcat中