Intellij IDEA Java classes not auto compiling on save

匿名 (未验证) 提交于 2019-12-03 02:38:01

问题:

Yesterday I switched to Intellij from Eclipse.

I am using jRebel with Websphere Server 7 as well.

Everything now seems to be working somewhat fine, except that when I modify a Java file, and hit save, Intellij does not re-compile the file, in order for jRebel to pick it up.

The eclipse "Build Automatically" feature resolved this issue.

In Intellij, I have to hit CTRL + SHIFT + 9 to re-compile the relevant class for jRebel to pick it up. If changes are done across two files, I have to do this on each and one of them and since Intellij uses the save all mechanism, its pretty hard to know what to recompile manually which I am not really interested in doing either.

Isn't there a way to make Intellij to do this on its own?

回答1:

UPDATED
For IDEA 12+ releases we can build automatically the edited sources if we are using the external compiler option. The only thing needed is to check the option "Build project automatically", located under Compiler Settings.

Also, if you would like to hot deploy, while the application is running or if you are using spring boot devtools you should enable the compiler.automake.allow.when.app.running from registry too. This will automatically compile your changes.

Using ctrl+shift+A (or +shift+A on mac) type Registry once the registry windows is open, locate and enable compiler.automake.allow.when.app.running, see here:


For versions older than 12, you can use the EclipseMode plugin to make IDEA automatically compile the saved files. See: https://www.jetbrains.com/help/idea/2016.3/eclipse.html for more tips when migrating from Eclipse.


回答2:

Please follow both steps:

1 - Enable Automake from the compiler

  • Press: ctrl + shift + A (For Mac + shift + A)
  • Type: make project automatically
  • Hit: Enter
  • Enable Make Project automatically feature

2 - Enable Automake when the application is running

  • Press: ctrl + shift + A (For Mac + shift + A)
  • Type: Registry
  • Find the key compiler.automake.allow.when.app.running and enable it or click the checkbox next to it

Note: Restart your application now :)

Note: This should also allow live reload with spring boot devtools.



回答3:

WARNING

Eclipse Mode plug-in is obsolete and is not compatible with the recent IDEA 12+ builds. If you install it, IDE will hang on every file change and will respond extremely slow.


IntelliJ IDEA doesn't use automatic build, it detects errors on the fly, not via compiler. Similar to Eclipse mode will be available in IDEA 12:

Use Build | Make, it invokes the incremental make process that will compile only changed and dependent files (it's very fast).

There is also a FAQ entry that may help.

Update on the automatic make feature: When run/debug configuration is running, Make project automatically has no effect. Classes on disk will change only on Build | Make. It's the core design decision as in our opinion class changes on disk should be always under user's control. Automatic make is not the copycat of Eclipse feature, it works differently and it's main purpose is to save time waiting for the classes to be ready when they are really needed (before running the app or tests). Automatic make doesn't replace the explicit compilation that you still need to trigger like in the case described in this question. If you are looking for different behavior, EclipseMode plug-in linked in the FAQ above would be a better choice.



回答4:

You can keymap ctrl+s to save AND compile in one step. Go to the keymap settings and search for Compile.



回答5:

I ended up recording a Macro to save and compile in one step, and keymap Ctrl+s to it.



回答6:

There is actually no difference as both require 1 click:

  • Eclipse: manual Save, auto-compile.
  • IntelliJ: auto Save, manual compile.

Simplest solution is just to get used to it. Because when you spend most of your daytime in your IDE, then better have fast habits in one than slow habits in several of them.



回答7:

I managed to solve this using macros.

I started recording a macro:

  • Click Edit - Macros - Start macro recording
  • Click File - Save All
  • Click Build - Make Project
  • Click Edit - Macros - Stop macro recording

Name it something useful like, "SaveAndMake".

Now just remove the Save all keybinding, and add the same keybinding to your macro!

So now, every time i save, it saves and makes a dirty compile, and jRebel now detects all changes correctly.



回答8:

Please follow these steps carefully to enable it.

1) create Spring Boot project with SB V1.3 and add "Devtools" (1*) to dependencies

2) invoke Help->Find Action... and type "Registry", in the dialog search for "automake" and enable the entry "compiler.automake.allow.when.app.running", close dialog

3) enable background compilation in Settings->Build, Execution, Deployment->Compiler "Make project automatically"

4) open Spring Boot run config, you should get warning message if everything is configured correctly

5) Run your app, change your classes on-the-fly

Please report your experiences and problems as comments to this issue.

click here for more info



回答9:

Use the Reformat and Compile plugin (inspired by the Save Actions plugin of Alexandre DuBreuil):

https://plugins.jetbrains.com/plugin/8231?pr=idea_ce

At the moment I am only offering a jar file, but this is the most important part of the code:

private final static Set documentsToProcess = new HashSet(); private static VirtualFile[] fileToCompile = VirtualFile.EMPTY_ARRAY;  // The plugin extends FileDocumentManagerAdapter. // beforeDocumentSaving calls reformatAndCompile private static void reformatAndCompile(         @NotNull final Project project,         @NotNull final Document document,         @NotNull final PsiFile psiFile) {     documentsToProcess.add(document);     if (storage.isEnabled(Action.compileFile) && isDocumentActive(project, document)) {         fileToCompile = isFileCompilable(project, psiFile.getVirtualFile());     }     ApplicationManager.getApplication().invokeLater(new Runnable() {         @Override         public void run() {             if (documentsToProcess.contains(document)) {                 documentsToProcess.remove(document);                 if (storage.isEnabled(Action.optimizeImports)                         || storage.isEnabled(Action.reformatCode)) {                     CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() {                         @Override                         public void run() {                             if (storage.isEnabled(Action.optimizeImports)) {                                 new OptimizeImportsProcessor(project, psiFile)                                     .run();                             }                             if (storage.isEnabled(Action.reformatCode)) {                                 new ReformatCodeProcessor(                                         project,                                         psiFile,                                         null,                                         ChangeListManager                                             .getInstance(project)                                             .getChange(psiFile.getVirtualFile()) != null)                                                 .run();                             }                             ApplicationManager.getApplication().runWriteAction(new Runnable() {                                 @Override                                 public void run() {                                     CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(psiFile);                                 }                             });                         }                     });                 }             }              if (fileToCompile.length > 0) {                 if (documentsToProcess.isEmpty()) {                     compileFile(project, fileToCompile);                     fileToCompile = VirtualFile.EMPTY_ARRAY;                 }             } else if (storage.isEnabled(Action.makeProject)) {                 if (documentsToProcess.isEmpty()) {                     makeProject(project);                 }             } else {                 saveFile(project, document, psiFile.getVirtualFile());             }         }     }, project.getDisposed()); }  private static void makeProject(@NotNull final Project project) {     ApplicationManager.getApplication().invokeLater(new Runnable() {         @Override         public void run() {             CompilerManager.getInstance(project).make(null);         }     }, project.getDisposed()); }  private static void compileFile(         @NotNull final Project project,         @NotNull final VirtualFile[] files) {     ApplicationManager.getApplication().invokeLater(new Runnable() {         @Override         public void run() {             CompilerManager.getInstance(project).compile(files, null);         }     }, project.getDisposed()); }  private static void saveFile(         @NotNull final Project project,         @NotNull final Document document,         @NotNull final VirtualFile file) {     ApplicationManager.getApplication().invokeLater(new Runnable() {         @Override         public void run() {             final FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance();             if (fileDocumentManager.isFileModified(file)) {                 fileDocumentManager.saveDocument(document);             }         }     }, project.getDisposed()); } 


回答10:

The only thing that worked for me in my maven project that was affected by this is to add a "test-compile" goal to the run configuration of my unit tests. Incredibly clumsy solution, but it works.



回答11:

Intellij fails quietly when it encounters compile problem in other module, and then automatic build is not performed. So check your Problems window



回答12:

Not enough points to comment on an existing answer, but similar to some people above, I wound up just adding a macro & keymap to Organize Imports / Format / SaveAll / FastReload(F9) / Synchronize.

The synchronize is added as it seems to be the only way I can also see updates in resources modified by external build tools / watchers (i.e., webpack).

The process is slower than eclipse - and for the external file refresh often have to run the command multiple times - but suppose I can live with it.



回答13:

I had the same issue. I was using the "Power save mode", which prevents from compiling incrementally and showing compilation errors.



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