IntelliJ and Tomcat…changed files are not automatically recognized by Tomcat

折月煮酒 提交于 2019-11-26 07:54:10

问题


I am running Intellij Ultimate with Tomcat and deploying a war. Everything deploys fine to the webapp directory of tomcat.

When I change a file like an xhtml file, is there a way for tomcat to automatically pick up that change? As of right now I need to copy the file from intellij and copy it to the directory of where it lives in the tomcat webapp directory. I know there are certain files that will need a recompile, but xhtml\'s are not one of them.


回答1:


This cannot be done if you deploy a war with IntelliJ IDEA. However, it can be if you deploy an exploded war. In IDEA:

  1. open your Tomcat Run/Debug configuration (Run > Edit Configurations)
  2. Go to the "Deployment" tab
  3. In the "Deploy at Server Startup" section, remove (if present) the artifact my-webapp-name:war
  4. Click the add icon, select 'artifact' and then select my-webapp-name:war exploded
  5. Click OK (on the "Select Artifacts to Deploy" dialog)
  6. Still in the Run/Debug Configuration Window, select the "Server" tab
  7. In the middle of that tab, change the "On frame Deactivation" setting to either "Update resources" or "Update Classes and Resources"
    • Update resources: All changed resources (that is, all application components other than the classes) will be updated.
    • Update classes and resources: All changed resources will be updated; changed classes will be recompiled. Note that whether the actual classes will be updated depends on the capabilities web server. If I recall, Tomcat will reload html/xhtml and jsp files, but not Servlets or classes that JSPs or Servlets use. You need to modified Tomcat to use a dynamic classloader for that.
  8. You can also set the "On 'update' " action to the one selected above as well.
    • This determined what happens when you hit the Update

      icon (or Ctrl+F10) in the Run window.
    • the "Show dialog" determines if IDEA prompts you each time you hit the update icon
  9. Click OK.

Now anytime you make a change, IDEA will redeploy the changed file(s) when IDEA's frame is deactivated (i.e. loses focus). It does take a second or two, You'll see it in the lower status bar in IDEA. Obviously. you'll still need to refresh your web browser so it fetches the new file (unless of course if the page has an auto refresh of ajax like fetch).

A good combination with Tomcat is to set "On frame deactivation" to "Update Resources" and the "On 'update' action to either "Redeploy" or "Restart Server". That allows static pages to be quickly updated via frame deactivation, and class updated via the 'update' action.

A company named ZeroTurnaround sells JRebel which is a dynamic classloader solution. They also have a five part series on the subject that's very good.




回答2:


Let me describe the sequence of actions using screenshots:

  1. Open your Tomcat Run/Debug configuration (Run > Edit Configurations)

  1. Click the add icon, select 'artifact' and then select pizza_mvc:war exploded:

  2. Modify 'On update action' and 'On frame diactivation':

  3. Everytime you want to refresh your resources, press <Ctrl> + F10




回答3:


If you want to update classes and resources, run Tomcat in Debug mode. In this mode IntelliJ update classes and resources without a problem (hot swap).

Got same problem. IntelliJ didn't update my project, because I run as "Run mode". When I run in debug mode and press Ctrl+F10, it updates classes and resources.




回答4:


I have found a better way.

In Eclipse we have automatically build, compile + reload static files. Actually static files are served directly from src/main/webapp.

In IntelliJ instead of serving directly from src/main/webapp, there is a folder created in target, in which you will have a copy of your src/main/webapp and also other context related .. web-inf/classes /lib.

If You put instead of the target the output of exploded artifact to src/main/webapp, it will not overwrite you source files, and it will serve directly, you won't have to hit - update resources / update resources and classes

So what you need to do in IntelliJ is

  1. modify exploded artifact output directory to src/main/webapp
  2. make a macro for save and recompile / compile dirty classes (cmd+shift+f9)
  3. edit registry and preferences to build automatically and build while app running(cmd+shift+a - registry).

After this, if you have jobs that change static files from outside IntelliJ, you will see changes immediately without going to IntelliJ and Update Resources, and for the classes you have that macro that saves, and compile(Note: You could also just hit Compile/Recompile : cmd + shift + F9 / cmd + F9 - if you have multiple opened editors will see that your dirty * editors will be non dirty, and changes(classes) will be reloaded)



来源:https://stackoverflow.com/questions/19596779/intellij-and-tomcat-changed-files-are-not-automatically-recognized-by-tomcat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!