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


135

我在Tomcat上运行Intellij Ultimate,并部署了战争。一切正常部署到tomcat的webapp目录。

当我更改xhtml文件之类的文件时,tomcat是否可以自动获取更改?到目前为止,我需要从Intellij复制文件并将其复制到tomcat Web应用程序目录中的文件所在的目录。我知道有些文件需要重新编译,但是xhtmls并不是其中之一。

Answers:


21

让我使用屏幕快照描述操作顺序:

  1. 打开Tomcat运行/调试配置(运行>编辑配置)

在此处输入图片说明

  1. 单击添加图标,选择“工件”,然后选择pizza_mvc:war exploded在此处输入图片说明

  2. 修改“更新动作”和“框架停用”: 在此处输入图片说明

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


感谢您提醒我检查“更新操作”
km1

290

如果使用IntelliJ IDEA部署战争,则无法完成此操作。但是,如果您展开了爆炸式战争,则可能是这样。在IDEA中:

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

现在,无论何时进行更改,当IDEA的框架被停用(即失去焦点)时,IDEA都会重新部署已更改的文件。确实需要一两秒钟,您将在IDEA的下部状态栏中看到它。明显。您仍然需要刷新您的Web浏览器,以便它可以获取新文件(当然,除非该页面具有ajax的自动刷新功能,例如fetch)。

与Tomcat的一个很好的组合是将“在框架上停用”设置为“更新资源”,并将“在'更新'上设置为“重新部署”或“重新启动服务器”。这允许通过框架停用快速更新静态页面,并且通过“更新”操作更新的类。

一家名为ZeroTurnaround的公司出售JRebel,这是一种动态的类加载器解决方案。他们在这个主题上也有一个由五个部分组成的系列,非常好。


我有错误:Error: Artifact 'my-webapp-name:war exploded' has invalid extension如何解决?
Anton Dozortsev'3

3
我也强烈建议使用DCEVM进行自动的类重新加载。然后,您可以使用“更新类和资源”来对源代码进行任何更改,而无需重新部署应用程序。请参阅:blog.jetbrains.com/idea/2013/07/…。除了本教程说明的内容外,还需要在“ Tomcat运行配置”的“设置/连接-调试”选项卡中将JAVA_HOME设置为指向DCEVM的JRE。
Alex Fedulov 2014年

1
@yaroslavprokipchyn-我不熟悉JBoss及其可能有的任何“特殊”要求。但据我所知,它应该工作相同。对于tomcat,IDEA创建一个Tomcat(context.xml)配置,该配置告诉Tomcat使用target / {contextName}目录作为webapp根目录。您可能需要查看帮助指南中有关JBO的任何特定信息。
Javaru 2014年

3
在第7步中,除非您将所有工件加载为“爆炸”,否则您将(至少在Intellij 14中)没有获得适当的下拉选择。
mortensi

1
@ChiefTwoPencils-步骤5是在“选择要部署的工件”对话框(没有“应用”)上单击“确定”,而不是“运行/调试”配置窗口。我在第5步中添加了一个澄清声明
。– Javaru

12

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

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


Control-F10为我解决了这个问题。谢谢!
Jeffrey Getzin '19

3

我找到了更好的方法。

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

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

如果放置目标而不是目标,则将爆炸后的工件输出到 src / main / webapp,它将不会覆盖您的源文件,并且将直接提供服务,因此您无需执行操作 - 更新资源/更新资源和类

因此,您需要在IntelliJ中做的是

  1. 将分解的工件输出目录修改为src / main / webapp 在此处输入图片说明
  2. 为保存和重新编译/编译脏类创建一个宏(cmd + shift + f9) 在此处输入图片说明 在此处输入图片说明
  3. 编辑注册表和首选项以自动构建并在应用运行时构建(cmd + shift + a-注册表)。 在此处输入图片说明 在此处输入图片说明

此后,如果您有从IntelliJ外部更改静态文件的作业,则无需转到IntelliJ和Update Resources就可以立即看到更改,并且对于具有保存的宏并进行编译的类(注意:您也可以直接单击Compile /重新编译:cmd + shift + F9 / cmd + F9-如果您有多个打开的编辑器,将会看到您的脏*编辑器将是非脏的,并且更改(类)将被重新加载)


看来,如果您启用了注册表editor.automake ..,它也只通过单击保存来推送更改。
Radu Toader

0

仅当您部署爆炸的war文件夹,启用热重载并以调试模式启动tomcat时,才有可能这样做。

这些是实现此目的的步骤。

  1. 打开您的Tomcat运行/调试配置(运行>编辑配置)
  2. 转到“部署”选项卡。3.在“在服务器启动时部署”部分中,删除工件my-webapp-name:war(如果存在)
  3. 点击添加图标,选择“工件”,然后选择my-webapp-name:战争爆炸
  4. 单击“确定”(在“选择要部署的工件”对话框上)
  5. 仍在“运行/调试配置”窗口中,选择“服务器”选项卡
  6. 将“停用框架”和“更新操作时”设置更改为“更新类和资源”
  7. 申请并保存
  8. 通过依次单击文件和设置转到常规项目设置,或者按CTRL + ALT + S
  9. 转到“构建,执行,部署”
  10. 编译器
  11. 选择自动构建项目
  12. 保存
  13. 在调试模式下启动tomcat

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.