it-swarm.com.de

Intellij IDEA Java-Klassen werden beim Speichern nicht automatisch kompiliert

Gestern bin ich von Eclipse zu Intellij gewechselt. 

Ich verwende auch jRebel mit Websphere Server 7.

Alles scheint jetzt etwas in Ordnung zu sein, außer dass wenn ich modifiziere eine Java-Datei und klicken Sie auf Speichern, Intellij nicht die Datei neu kompilieren, in Bestellung für jRebel, um es abzuholen. 

Die Eclipse-Funktion "Automatisch erstellen" hat dieses Problem behoben. 

In Intellij muss ich STRG + UMSCHALT + 9 drücken, um die relevante Klasse für jRebel erneut zu kompilieren, um sie abholen zu können. Wenn Änderungen in zwei Dateien vorgenommen werden, habe ich um dies bei jedem von ihnen zu tun und da Intellij den Save All-Mechanismus verwendet, ist es ziemlich schwierig zu wissen, was manuell neu kompiliert werden muss Ich bin auch nicht wirklich daran interessiert.

Gibt es keine Möglichkeit, Intellij zu macht dies alleine zu machen?

151
momomo

Bitte befolgen Sie beide Schritte:

1 - Aktivieren Sie Automake vom Compiler aus

  • Drücken Sie: ctrl + shift + A (Für Mac  + shift + A)
  • Typ: make project automatically
  • Schlagen: Enter
  • Make Project automatically aktivieren

2 - Aktivieren Sie Automake, wenn die Anwendung ausgeführt wird

  • Drücken Sie: ctrl + shift + A (Für Mac  + shift + A)
  • Typ: Registry
  • Suchen Sie den Schlüssel compiler.automake.allow.when.app.running und aktivieren Sie ihn oder klicken Sie auf das Kontrollkästchen daneben

Hinweis: Starten Sie Ihre Anwendung jetzt neu :)

Hinweis: Dies sollte auch ein Live-Nachladen mit Spring-Boot-Devtools ermöglichen.

72
snovelli

WARNUNG

Eclipse Mode -Plug-In ist veraltet und ist nicht kompatibel mit den letzten IDEA 12+ Builds. Wenn Sie es installieren, wird IDE bei jeder Dateiänderung hängen bleiben und extrem langsam reagieren.


IntelliJ IDEA verwendet kein automatisches Build, es erkennt Fehler im Fluge und nicht über den Compiler. Ein ähnlicher Modus wie der Eclipse-Modus wird in IDEA 12 verfügbar sein:

Make project automatically

Verwenden Sie Build | Make ruft den inkrementellen make-Prozess auf, der nur geänderte und abhängige Dateien kompiliert (sehr schnell).

Es gibt auch einen FAQ -Eintrag , der helfen kann.

Update für die automatische Make-Funktion: Wenn die run/debug-Konfiguration ausgeführt wird, hat Make project automatically keine Auswirkungen. Klassen auf der Festplatte ändern sich nur bei Build | Make. Dies ist die Kernentscheidungsentscheidung, da nach unserer Meinung Klassenänderungen auf der Festplatte immer vom Benutzer kontrolliert werden sollten. Die automatische Erstellung ist nicht die Nachahmung der Eclipse-Funktion. Sie funktioniert anders und hat den Zweck, Zeit zu sparen, bis die Klassen bereit sind, wenn sie wirklich benötigt werden (bevor die App oder die Tests ausgeführt werden). Die automatische Erstellung ersetzt nicht die explizite Kompilierung, die Sie immer noch auslösen müssen, wie in dem in dieser Frage beschriebenen Fall. Wenn Sie nach einem anderen Verhalten suchen, ist das in FAQ oben verknüpfte EclipseMode-Plug-In die bessere Wahl.

64
CrazyCoder

Sie können keymap ctrl+s in einem Schritt speichern und kompilieren. Gehen Sie zu den Keymap-Einstellungen und suchen Sie nach Compile.

36
Daniel Kaplan

Es gibt tatsächlich keinen Unterschied , da beide 1 Klick erfordern:

  • Eclipse: manuell speichern, automatisch kompilieren. 
  • IntelliJ: Auto Save, manuelles Kompilieren.

Einfachste Lösung ist nur um sich daran zu gewöhnen. Denn wenn Sie die meiste Zeit Ihres Tages in Ihrer IDE verbringen, sollten Sie sich schneller mit schnellen Gewohnheiten auseinandersetzen als mit langsamen.

15
andruso

Am Ende nahm ich ein Macro auf, um es in einem Schritt zu speichern und zu kompilieren, und Ctrl+s keymap dazu.

14
TonioKnight

Es gelang mir, dies mit Makros zu lösen.

Ich fing an, ein Makro aufzunehmen:

  • Klicken Sie auf Bearbeiten - Makros - Makroaufnahme starten
  • Klicken Sie auf Datei - Alle speichern
  • Klicken Sie auf Erstellen - Projekt erstellen
  • Klicken Sie auf Bearbeiten - Makros - Makroaufnahme stoppen

Nennen Sie es etwas Nützliches wie "SaveAndMake".

Entfernen Sie nun einfach die Tastenkombination "Alle speichern" und fügen Sie Ihrem Makro dieselbe Tastenkombination hinzu! 

Jedes Mal, wenn ich speichere, speichert es und macht ein schmutziges Kompilieren, und jRebel erkennt nun alle Änderungen korrekt.

10
Niklas Lönn

Bitte befolgen Sie diese Schritte sorgfältig, um sie zu aktivieren. 

1) Spring Boot-Projekt mit SB V1.3 erstellen und "Devtools" (1 *) zu Abhängigkeiten hinzufügen 

2) Rufen Sie Help-> Find Action ... auf und geben Sie "Registry" ein, suchen Sie im Dialog nach "automake" und aktivieren Sie den Eintrag "compiler.automake.allow.when.app.running", schließen Sie Dialog

3) Aktivieren Sie die Hintergrundkompilierung in Einstellungen-> Erstellen, Ausführen, Bereitstellen-> Compiler "Projekt automatisch erstellen".

4) Öffnen Sie Spring Boot run config. Sie sollten eine Warnmeldung erhalten, wenn alles korrekt konfiguriert ist

5) Führen Sie Ihre App aus und ändern Sie Ihre Kurse im Handumdrehen

Bitte berichten Sie Ihre Erfahrungen und Probleme als Kommentare zu diesem Problem.

hier klicken für mehr Infos

5
Ajay

Das einzige, was für mich in meinem Maven-Projekt funktioniert hat, das davon betroffen war, ist das Hinzufügen eines Test-Compile-Ziels zur Laufkonfiguration meiner Unit-Tests. Unglaublich unbeholfene Lösung, aber es funktioniert.

 enter image description here

2
keyboardsamurai

Es hat bei mir nicht funktioniert, weil ich ein unnötiges Modul in meiner Projektstruktur hatte. Die Tests wurden vermutlich mit dem anderen Modul durchgeführt.

Ich weiß nicht, wie es dazu kam, aber das Entfernen löste das Problem.

Stellen Sie sicher, dass Ihre Run/Debug-Einstellungen das Modul verwenden, das Sie mit dem Autosave erstellen.

Z.B. : siehe das Modul in

 enter image description here 

Sie können die Module in Projektstruktur - Module ändern

 enter image description here 

1
Orkun Ozen

Verwenden Sie das Reformat- und Compile-Plugin (inspiriert durch das Save Actions-Plugin von Alexandre DuBreuil):

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

Im Moment biete ich nur eine JAR-Datei an, aber dies ist der wichtigste Teil des Codes:

private final static Set<Document> documentsToProcess = new HashSet<Document>();
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());
}
1
sbmpost

Intellij schlägt im Ruhezustand fehl, wenn ein Kompilierungsproblem in einem anderen Modul auftritt, und der automatische Build wird nicht ausgeführt. Überprüfen Sie also Ihr Problems-Fenster

1
tworec

Ich habe eine Fehlermeldung erhalten: Einige Gläser befinden sich nicht im Klassenpfad. Deshalb lösche ich nur das beschädigte Glas und die unten aufgeführten Schritte

1.Project >  Setting>Build,Execution,Deployment>Compiler>check build project automatically
2.CTRL+SHIFT+A find/search **registry** --Check for below param
compiler.automake.allow.when.app.running
compiler.automake.trigger.delay=500---According to ur requirement
3.Add devtool in pom.xml
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
4.Build ,If found any probelm while building ,saying some jar in not in class path.Just delete the corrupted jar
and re-build the project angain after sync with maven lib
0
Priyanshu Singh

Bearbeiten Sie Ihre Run/Debug Configuration so, dass die Build-Option vor dem Start ausgewählt wird

 enter image description here

After Build Option ist ausgewählt

 enter image description here

Die obige Lösung funktionierte für mich, während ich an meiner JBehave-Testsuite arbeitete

0