2013-10-25 90 views
105

我正在运行Intellij Ultimate和Tomcat并部署战争。一切都部署到tomcat的webapp目录。IntelliJ和Tomcat ....更改的文件不会被Tomcat自动识别

当我像xhtml文件一样更改文件时,有没有办法让tomcat自动获取该更改?截至目前,我需要从intellij复制文件,并将其复制到它所在tomcat webapp目录中的目录。我知道某些文件需要重新编译,但是xhtml不是其中之一。

回答

236

如果您使用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. 您还可以设置“‘更新’行动也是如此。
    • 这个决定,当你打了更新Update icon图标(或按Ctrl + F10)在运行窗口中会发生什么。
    • “显示对话框中的”确定IDEA提示您每次打更新图标
  9. 单击确定时间。

现在无论何时您进行更改,IDEA都会在IDEA框架停用时重新部署更改的文件(即,失去了重点)。这需要一两秒钟,您会在IDEA中较低的状态栏中看到它。明显。你仍然需要刷新你的网页浏览器,以便获取新文件(除非页面有像提取那样的自动刷新Ajax)。

与Tomcat的良好结合是将“On frame deactivation”设置为“Update Resources”并将“On'update'操作设置为”重新部署“或”重新启动服务器“。帧失活,和阶级通过“更新”行动更新。

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

+0

谢谢。这个伎俩。我是新的Stackoverflow,所以我不知道如何把它作为一个回答的问题。 – Peter

+0

我有错误:'错误:神器'我的webapp名称:战争爆炸'具有无效的扩展名'如何解决? –

+3

我也强烈建议使用DCEVM进行自动类重装。然后,您可以使用“更新类和资源”将所有更改应用于源代码,而无需重新部署应用程序。请参阅:http://blog.jetbrains.com/idea/2013/07/get-true-hot-swap-in-java-with-dcevm-and-intellij-idea/。除了本教程解释的内容之外,还需要在Tomcat运行配置的Setup/Connection - Debug选项卡中将JAVA_HOME设置为指向DCEVM的JRE。 –

13

让我描述的动作序列使用屏幕截图:

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

enter image description here

  • 点击添加图标,选择 '伪影',然后选择pizza_mvc:war explodedenter image description here

  • 修改 '关于更新行动' 和 '论框架diactivation': enter image description here

  • 要刷新你的资源
  • 每次,按<Ctrl> + F10

  • +0

    感谢提醒我检查“在'更新'行动” – km1

    6

    如果要更新类和资源。在“调试模式”下运行Tomcat。此模式下的InteliJ更新没有问题类和资源。

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

    0

    我找到了更好的方法。

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

    的IntelliJ,而不是直接从SRC服务/主/ web应用,则在目标创建的文件夹,在其中你将有你的的src/main/webapp的以及其他方面相关的副本.. web-inf/classes/lib。

    如果你把而不是目标的爆炸神器的输出的src/main/webapp的,它不会覆盖你的源文件,它将直接服务,您不会有打 - 更新资源/更新资源和类

    所以,你需要的IntelliJ做的是

    1. 修改展开神器输出目录的src/main/webapp的 enter image description here
    2. 做出保存和重新编译/编译脏类(CMD + Shift + F9) enter image description here enter image description here
    3. 编辑注册表和喜好自动构建和构建宏,而应用程序运行(CMD + Shift + A键 - 注册表)。 enter image description here enter image description here

    在此之后,如果您有来自的IntelliJ外部改变的静态文件的作业,你会马上看到变化,而不去的IntelliJ和更新资源,而对于类你有宏,节省,并编译(注意:你也可以点击Compile/Recompile:cmd + shift + F9/cmd + F9 - 如果你有多个打开的编辑器会看到你的脏编辑器不会变脏,并且变化重新加载)

    +0

    看来,如果你有注册表compiler.automake ..启用它只推命中保存你的更改。 –