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的设置