IntelliJ 和 Tomcat....更改的文件不会被 Tomcat 自动识别

Posted

技术标签:

【中文标题】IntelliJ 和 Tomcat....更改的文件不会被 Tomcat 自动识别【英文标题】:IntelliJ and Tomcat....changed files are not automatically recognized by Tomcat 【发布时间】:2013-11-04 23:33:01 【问题描述】:

我正在使用 Tomcat 运行 Intellij Ultimate 并部署战争。一切都很好地部署到了 tomcat 的 webapp 目录。

当我更改像 xhtml 文件这样的文件时,tomcat 有没有办法自动获取该更改?截至目前,我需要从 Intellij 复制文件并将其复制到它位于 tomcat Web 应用程序目录中的目录。我知道有些文件需要重新编译,但 xhtmls 不是其中之一。

【问题讨论】:

【参考方案1】:

如果您使用 IntelliJ IDEA 部署战争,则无法做到这一点。但是,如果您部署了爆发战争,它可能会发生。在 IDEA 中:

    打开您的 Tomcat 运行/调试配置(运行 > 编辑配置) 转到“部署”选项卡 在“在服务器启动时部署”部分,删除(如果存在)工件 my-webapp-name:war 单击添加图标,选择“工件”,然后选择my-webapp-name:war exploded 单击确定(在“选择要部署的工件”对话框中) 仍在运行/调试配置窗口中,选择“服务器”选项卡 在该选项卡的中间,将“帧停用”设置更改为“更新资源”或“更新类和资源” 更新资源:所有更改的资源(即除类之外的所有应用程序组件)都将被更新。 更新类和资源:所有改变的资源都会被更新;更改的类将被重新编译。请注意,是否更新实际类取决于功能 Web 服务器。如果我记得,Tomcat 将重新加载 html/xhtml 和 jsp 文件,但不会重新加载 Servlet 或 JSP 或 Servlet 使用的类。您需要修改 Tomcat 以为此使用动态类加载器。 您也可以将“On 'update'”操作设置为上面选择的操作。 这决定了当您在“运行”窗口中点击更新 图标(或Ctrl+F10)时会发生什么。 “显示对话框”决定 IDEA 是否在您每次点击更新图标时提示您 点击确定。

现在,只要您进行更改,IDEA 的框架会在停用(即失去焦点)时重新部署更改的文件。它确实需要一两秒钟,您会在 IDEA 的下方状态栏中看到它。明显地。您仍然需要刷新您的网络浏览器,以便它获取新文件(当然,除非页面具有自动刷新 ajax 之类的功能)。

与 Tomcat 的一个很好的组合是将“On frame deactivation”设置为“Update Resources”,并将“On 'update' action 设置为“Redeploy”或“Restart Server”。这样可以通过 frame 快速更新静态页面停用,并通过“更新”操作更新类。

一家名为 ZeroTurnaround 的公司销售 JRebel,这是一种动态类加载器解决方案。他们还有一个非常好的five part series on the subject。

【讨论】:

我有错误:Error: Artifact 'my-webapp-name:war exploded' has invalid extension 如何解决? 我也强烈推荐使用 DCEVM 来自动重新加载类。然后,您可以使用“更新类和资源”将任何更改应用于源代码,而无需重新部署应用程序。请参阅:blog.jetbrains.com/idea/2013/07/…。除了本教程解释的内容之外,还需要在 Tomcat 运行配置的 Setup/Connection - Debug 选项卡中设置 JAVA_HOME 以指向 DCEVM 的 JRE。 @yaroslavprokipchyn - 我不熟悉 JBoss 以及它可能有的任何“特殊”要求。但据我所知,它应该是一样的。对于 tomcat,IDEA 创建一个 Tomcat (context.xml) 配置,告诉 Tomcat 使用 target/contextName 目录作为 webapp 根目录。您可能需要查看帮助指南以获取任何 JBOs 特定信息。 在第 7 步中,您将不会(至少在 Intellij 14 中)获得适当的下拉选项,除非您将所有工件加载为“爆炸”。 @ChiefTwoPencils - 第 5 步是在“选择要部署的工件”对话框(没有“应用”)上单击“确定”,而不是“运行/调试”配置窗口。我在第 5 步中添加了一个澄清声明。【参考方案2】:

让我用屏幕截图来描述操作的顺序:

    打开您的 Tomcat 运行/调试配置(运行 > 编辑配置)

    单击添加图标,选择“工件”,然后选择pizza_mvc:war exploded

    修改“更新操作”和“帧停用”:

    每当您想刷新资源时,请按<Ctrl> + F10

【讨论】:

感谢您提醒我检查“在‘更新’操作时”【参考方案3】:

如果要更新类和资源,请在调试模式下运行Tomcat。在这种模式下,IntelliJ 可以毫无问题地更新类和资源(热交换)。

遇到同样的问题。 IntelliJ 没有更新我的项目,因为我以“运行模式”运行。当我在调试模式下运行并按下Ctrl+F10时,它会更新类和资源。

【讨论】:

Control-F10 为我解决了这个问题。谢谢!【参考方案4】:

我找到了更好的方法。

Eclipse中,我们已经自动构建、编译+重新加载静态文件。实际上静态文件是直接从 src/main/webapp 提供的。

IntelliJ 中,不是直接从 src/main/webapp 提供服务,而是在 target 中创建了一个文件夹,您将在其中拥有 的副本src/main/webapp 以及其他与上下文相关的 .. web-inf/classes /lib。

如果您将分解后的工件的输出而不是目标放到src/main/webapp,它不会覆盖您的源文件,而是直接提供服务,您不会必须打 - 更新资源/更新资源和类

所以你需要在 IntelliJ 中做的是

    将分解后的工件输出目录修改为 src/main/webapp 制作一个宏来保存和重新编译/编译脏类(cmd+shift+f9) 编辑注册表和首选项以在应用程序运行时自动构建和构建(cmd+shift+a - 注册表)。

在此之后,如果您有从 IntelliJ 外部更改静态文件的作业,您将立即看到更改,而无需转到 IntelliJ 和更新资源,并且对于您拥有保存的宏的类,以及编译(注意:你也可以点击编译/重新编译:cmd + shift + F9 / cmd + F9 - 如果你有多个打开的编辑器会看到你的脏 * 编辑器将是非脏的,并且更改(类)将被重新加载)

【讨论】:

看来,如果你启用了注册表 compiler.automake.. 它只会通过点击保存来推送你的更改。【参考方案5】:

这只有在你部署爆炸的war文件夹、启用热重载并在调试模式下启动tomcat时才有可能。

这些是实现这一目标的步骤。

    打开您的 Tomcat 运行/调试配置(运行 > 编辑配置) 转到“部署”选项卡 3.在“在服务器启动时部署”部分,删除(如果存在)工件 my-webapp-name:war 单击添加图标,选择“工件”,然后选择 my-webapp-name:war exploded 单击确定(在“选择要部署的工件”对话框中) 仍在运行/调试配置窗口中,选择“服务器”选项卡 将“帧停用”和“更新操作”设置更改为“更新类和资源” 应用并保存 依次单击“文件”和“设置”或按 CTRL + ALT + S 进入正常项目设置 转到“构建、执行、部署” 编译器 选择自动构建项目 保存 在调试模式下启动 tomcat

【讨论】:

【参考方案6】:

如果您有想要立即查看/播放的多部分文件,请直接上传到目标文件夹。 *(仅将写入位置更改为目标文件夹/static/)

String yourpath = C\\andSoForth
    yourPath + "\\target\\classes\\static\\uploads\\audiofiles\\"

您将能够立即查看您的文件,而无需重新启动您的 IDE

【讨论】:

以上是关于IntelliJ 和 Tomcat....更改的文件不会被 Tomcat 自动识别的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA 一个Tomcat启动多个Web的设置

让 IntelliJ IDEA 刷新项目并检测更改的文件

Intellij IDEA基础设置

IntelliJ和tomcat中的目录结构

服务器未连接。部署不可用。 IntelliJ 13 和 Tomcat 7

IntelliJ IDEA:Maven,项目编译和部署