Intellij IDEA Java-Klassen werden beim Speichern nicht automatisch kompiliert

181

Gestern bin ich von Eclipse zu IntelliJ IDEA gewechselt.

Ich verwende JRebel auch mit WebSphere Server 7.

Jetzt scheint alles einwandfrei zu funktionieren, außer dass IntelliJ die Datei nicht neu kompiliert , wenn ich eine Java-Datei ändere und auf Speichern drücke, damit JRebel sie abholt.

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

In IntelliJ IDEA muss ich CTRL+ SHIFT+ 9drücken, um die relevante Klasse neu zu kompilieren, damit JRebel sie abholen kann. Wenn Änderungen an zwei Dateien vorgenommen werden , muss ich dies für jede einzelne Datei tun. Da IntelliJ den Mechanismus zum Speichern aller Dateien verwendet, ist es ziemlich schwierig zu wissen, was manuell neu kompiliert werden soll, was mich auch nicht wirklich interessiert.

Gibt es nicht eine Möglichkeit, IntelliJ dazu zu bringen, dies selbst zu tun ?

mmm
quelle
11
Warum drückst du nicht einfach Ctrl+ F9? Dadurch wird das gesamte Projekt erstellt. Wenn sich nur zwei Dateien geändert haben, werden diese neu erstellt.
Maba
2
Ich hatte Angst, es würde alles wieder aufbauen. Ich glaube, die Standardeinstellung ist eine klare Ausgabe beim Wiederaufbau ... normalerweise funktioniert dies nicht gut ...
mmm
5
Es wird vor dem Erstellen nicht gereinigt. Es ist ein inkrementeller Build. Sie haben eine andere Wahl, um auf Wunsch neu zu erstellen.
Maba
Überprüfen Sie dies heraus: stackoverflow.com/questions/19596779/…
Radu Toader

Antworten:

249

AKTUALISIERT

Für IntelliJ IDEA 12+ -Versionen können wir die bearbeiteten Quellen automatisch erstellen, wenn wir die externe Compileroption verwenden. Sie müssen lediglich die Option " Projekt automatisch erstellen " unter " Compiler " -Einstellungen aktivieren:

Compiler-Einstellungen

Wenn Sie während der Ausführung der Anwendung eine Hot-Bereitstellung durchführen möchten oder wenn Sie Spring-Boot-Devtools verwenden, sollten Sie auch die From- compiler.automake.allow.when.app.runningRegistrierung aktivieren . Dadurch werden Ihre Änderungen automatisch kompiliert.

Verwenden Sie Ctrl+ Shift+ A(oder + Shift+ Aauf dem Mac), Registrysobald das Registrierungsfenster geöffnet ist, suchen und aktivieren Sie es compiler.automake.allow.when.app.running, siehe hier:

Geben Sie hier die Bildbeschreibung ein


Bei Versionen älter als 12 können Sie das EclipseMode- Plugin verwenden, damit IDEA die gespeicherten Dateien automatisch kompiliert.

Weitere Tipps finden Sie im Handbuch "Migration von Eclipse zu IntelliJ IDEA" .

Dan
quelle
10
Es ist ärgerlich, dass ich dafür ein Plugin installieren muss. Ich habe schon gestern und heute damit verbracht. Ich wünschte, sie könnten einfach eine Option dafür einbauen. Ich glaube nicht, dass Eclipse ein Patent für diese Funktion hat, oder? Ich könnte auch STRG + S neu zuordnen, um es zu machen, da es automatisch speichert. Ich werde ein paar Optionen ausprobieren. danke
mmm
14
Das ist langsam. Das ist zu langsam. Es gibt viel Raum für Verbesserungen! Ich bin nicht das, was es im Hintergrund macht, aber es dauert ungefähr 3-4 Sekunden, bis Intellij eine kleine Änderung in einer einzelnen Klasse kompiliert hat. Sogar "Compile 'StartController.java'" bedeutet, dass eine Klasse nur 3-4 Sekunden dauert. Eclipse erledigt dies in weniger als 100 Millisekunden. Ich werde das Eclipse-Modus-Plugin erneut testen und entscheiden, was ich
tun soll
34
"Projekt automatisch
erstellen
8
Funktioniert bei mir nicht mit Intellij 2017.1.3 und Spring Boot Devtools.
Nico de Wet
1
Arbeiten Sie nicht mit IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Do Nhu Vy
75

Bitte folgen Sie beiden Schritten:

1 - Aktivieren Sie Automake über den Compiler

  • Drücken Sie: ctrl+ shift+ A(für Mac + shift+ A)
  • Art: make project automatically
  • Schlagen: Enter
  • Aktivieren Sie Make Project automaticallyFunktion

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

  • Drücken Sie: ctrl+ shift+ A(für Mac + shift+ A)
  • Art: Registry
  • Suchen Sie den Schlüssel compiler.automake.allow.when.app.runningund aktivieren Sie ihn oder aktivieren Sie das Kontrollkästchen daneben

Hinweis: Starten Sie Ihre Anwendung jetzt neu :)

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

Snovelli
quelle
2
Perfekt, das war genau das, wonach ich gesucht habe =)
eitch
3
Dies funktionierte auch für mich mit Spring-Boot-Devtools und IntelliJ IDEA 2016.2.5
Xaero Degreaz
2
Richtig, das scheint auf IntelliJ 2017.1.3 zu funktionieren. Ich habe Option 2 verwendet, da dies bei Spring Boot Devtools erforderlich ist.
Nico de Wet
1
Hat gut funktioniert, aber das Nachladen in JRebel dauert 4-5 Sekunden. Wie kann man das umgehen?
user3184974
1
Ich denke nicht, dass die obigen Punkte 1 und 2 "Optionen" sind, sondern Schritte. Sie müssen beides tun.
Thomas Carlisle
67

WARNUNG

Das Eclipse-Modus- Plug-In ist veraltet und nicht mit den neuesten IDEA 12+ Builds kompatibel. Wenn Sie es installieren, bleibt die IDE bei jeder Dateiänderung hängen und reagiert extrem langsam.


IntelliJ IDEA verwendet keine automatische Erstellung, sondern erkennt Fehler im laufenden Betrieb und nicht über den Compiler. Ähnlich wie im Eclipse-Modus wird es in IDEA 12 verfügbar sein :

Projekt automatisch erstellen

Verwenden Sie Build| Makeruft den inkrementellen Erstellungsprozess 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, Make project automaticallyhat dies keine Auswirkungen. Klassen auf der Festplatte ändern sich nur auf Build| Make. Dies ist die zentrale Entwurfsentscheidung, da unserer Meinung nach Klassenänderungen auf der Festplatte immer unter der Kontrolle des Benutzers stehen sollten. Das automatische Erstellen ist nicht der Nachahmer der Eclipse-Funktion, es funktioniert anders und es dient hauptsächlich dazu, Zeit zu sparen, bis die Klassen bereit sind, wenn sie wirklich benötigt werden (bevor die App oder die Tests ausgeführt werden). Das automatische Erstellen ersetzt nicht die explizite Kompilierung, die Sie noch auslösen müssen, wie in dem in dieser Frage beschriebenen Fall. Wenn Sie nach einem anderen Verhalten suchen, ist das in den obigen FAQ verlinkte EclipseMode-Plug-In die bessere Wahl.

CrazyCoder
quelle
Ja, ich hatte es schon einmal gesehen, aber mit dem Popup und allem als zu langsam abgetan. Ich dachte, es wäre für etwas anderes. Ich könnte es versuchen, obwohl STRG + 9 ärgerlich ist, aber ich denke, ich könnte STRG + S neu zuordnen, um es zu machen, da es automatisch speichert.
mmm
Danke für das Update. Ich habe das Eclipse Mode Plugin installiert. Haben Sie diesen Dialog nicht ... Ook .. Intellij 12 ... gut, dass Sie sich verbessern. Ist Intellij 12 ausgeglichen?
mmm
3
Ich habe 12 für ein paar Tage ausprobiert. Die Verwendung von externem Build -> make automatisch löst keine Aktion aus. Nichts passiert. Wenn ich das Eclipse-Modus-Plugin verwende (es in den Einstellungen aktivieren / deaktivieren), funktioniert das einwandfrei, aber wenn ich das Eclipse-Modus-Plugin deaktiviere und "Externe Build verwenden -> Auto-Make" aktiviere, passiert beim Bearbeiten und Speichern nichts ... jede Idee dazu Warum?
mmm
2
@CrazyCoder Ich bin gerade darauf zurückgekommen und jRebel. Das ist zu langsam. Es gibt viel Raum für Verbesserungen! Ich bin nicht das, was es im Hintergrund macht, aber es dauert ungefähr 3-4 Sekunden, bis Intellij eine kleine Änderung in einer einzelnen Klasse kompiliert hat. Sogar "Compile 'StartController.java'" bedeutet, dass eine Klasse nur 3-4 Sekunden dauert. Eclipse erledigt dies in weniger als 100 Millisekunden. Ich werde das Plugin erneut testen und entscheiden, was ich
tun soll
1
Verhaltensvorschläge für die Registerkarte @SecretService sind unter youtrack.jetbrains.com/issues/IDEA willkommen . Es gibt bereits mehrere offene Probleme mit angehefteten Registerkarten, die das Schließen verhindern.
CrazyCoder
38

Sie können eine Keymap ctrl+szum Speichern UND Kompilieren in einem Schritt erstellen. Gehen Sie zu den Keymap-Einstellungen und suchen Sie nach Compile.

Daniel Kaplan
quelle
3
Danke, das gefällt mir am besten! Das automatische Kompilieren in Intellij und auch dieses, aber zumindest sehe ich, wenn es jetzt fertig ist, ist zu langsam.
mmm
Hat bei mir nicht funktioniert, das Zuweisen von STRG + S zum Kompilieren hat meinen Server nicht neu gestartet. Starten Sie mit der Debug-Schaltfläche
Dimitri Kopriwa
Es funktioniert bei mir, Intellij 2018.2. Es sollte nach Build Project
Neo Pham
18

Es gibt eigentlich keinen Unterschied, da beide 1 Klick erfordern:

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

Die einfachste Lösung besteht darin, sich daran zu gewöhnen. Denn wenn Sie den größten Teil Ihres Tages in Ihrer IDE verbringen, sollten Sie schnell schnelle Gewohnheiten in einer haben als langsame Gewohnheiten in mehreren von ihnen.

andruso
quelle
2
Es gibt eine Möglichkeit, die IntelliJ-Erfahrung zu verbessern: Speichern und Kompilieren, während Sie zum Browser
wechseln
Eclipse bietet die Möglichkeit, Speicheraktionen hinzuzufügen. Sie können also auch Importe organisieren und Code beim Speichern formatieren. Wenn Sie all diese Dinge manuell ausführen, wird eine erhebliche Anzahl von Tastenanschlägen hinzugefügt, und der Prozess wird fehleranfälliger. Beispielsweise können Sie niemals unformatierten Code haben, wenn Sie beim Speichern in Eclipse formatieren. Es ist sehr leicht, die Formatierung in IntelliJ zu vergessen.
Max
@Max, IntelliJ führt diese Aktionen während des Commits aus (was nach meinem persönlichen Geschmack der beste Moment ist). In einigen Fällen werden auch Codierungsstilprobleme direkt im Editor hervorgehoben (z. B. PEP8-Konformität für Python).
Andruso
2
Sich an etwas zu gewöhnen, das eine IDE für mich tut und eine andere nicht, was mein Leben schwieriger macht, ist kein gutes Verkaufsargument.
Jonathan
@Jonathan Um die Benutzerfreundlichkeit zu verbessern, müssen häufig alte, oft unnötige Gewohnheiten für Benutzer gelöscht werden.
Andruso
17

Am Ende habe ich ein Makro aufgenommen , um es in einem Schritt zu speichern, zu kompilieren und eine Keymap Ctrl+szu erstellen .

TonioKnight
quelle
5
@SecretService Funktioniert möglicherweise nicht für alle, da die Reihenfolge der Aktionen nicht definiert ist, wenn mehrere Aktionen derselben Verknüpfung zugeordnet sind.
Celos
13

Ich habe es geschafft, dies mit Makros zu lösen.

Ich habe angefangen, 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 jetzt einfach die Option Alle Tastenkombinationen speichern und fügen Sie Ihrem Makro dieselbe Tastenkombination hinzu!

Jedes Mal, wenn ich speichere, wird eine schmutzige Kompilierung gespeichert und durchgeführt, und jRebel erkennt jetzt alle Änderungen korrekt.

Niklas Lönn
quelle
Ich würde vorschlagen, dem Makro eine andere Tastenkombination zu geben, anstatt die vorhandenen zu ersetzen - aber das ist genauso subjektiv.
Arcseldon
Vielen Dank. Da ein normaler "Build" (wie in den anderen Antworten vorgeschlagen) für mich nicht einmal ausreicht, verwende ich diese Lösung, um jedes Mal zu speichern und neu zu erstellen. Gibt mir das Eclipse-Gefühl zurück, auch wenn es viele Ressourcen verbraucht ...
Boris
5

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

1) Erstellen Sie ein Spring Boot-Projekt mit SB V1.3 und fügen Sie "Devtools" (1 *) zu den Abhängigkeiten hinzu

2) Rufen Sie Help-> Find Action ... auf und geben Sie "Registry" ein. Suchen Sie im Dialogfeld nach "automake" und aktivieren Sie den Eintrag " compiler.automake.allow.when.app.running ". Schließen Sie das Dialogfeld

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

4) Öffnen Sie die Spring Boot Run-Konfiguration. Sie sollten eine Warnmeldung erhalten, wenn alles richtig konfiguriert ist

5) Führen Sie Ihre App aus und ändern Sie Ihre Klassen im laufenden Betrieb

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

Klicken Sie hier für weitere Informationen

Ajay Kumar
quelle
Es ist als noch "In Bearbeitung" markiert und funktioniert bei mir nicht.
JGarrido
2

Das einzige, was für mich in meinem Maven-Projekt, das davon betroffen war, funktioniert hat, ist, der Laufkonfiguration meiner Unit-Tests ein "Test-Compile" -Ziel hinzuzufügen. Unglaublich ungeschickte Lösung, aber es funktioniert.

Geben Sie hier die Bildbeschreibung ein

Tastaturenamurai
quelle
Zumindest funktioniert es: D aber ja, es ist besser, eine Quelle für dieses Problem zu finden
anindis
2

Intellij schlägt leise fehl, wenn ein Kompilierungsproblem in einem anderen Modul auftritt und dann keine automatische Erstellung durchgeführt wird. Überprüfen Sie also Ihr ProblemsFenster

tworec
quelle
1

Ich hatte das gleiche Problem. Ich habe den "Energiesparmodus" verwendet, der verhindert, dass inkrementell kompiliert wird und Kompilierungsfehler angezeigt werden.

user3214451
quelle
Ich weiß nicht, warum diese Antwort abgelehnt wurde, sie beantwortet auch die Frage, für mich war es das gleiche - "Energiesparmodus", obwohl es in den Einstellungen geschrieben wurde, aber mit dieser aktivierten automatischen Kompilierung funktioniert es nicht.
Nerius Jok
1

Verwenden Sie das Plugin "Neuformatieren und Kompilieren" (inspiriert vom Plugin "Aktionen speichern" 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());
}
sbmpost
quelle
2
Warum sollte jemand zufälligen Code herunterladen und ausführen?
Drew
@Drew: Habe es gerade zur Überprüfung auf Jetbrains hochgeladen. Aber wenn Sie paranoid sind, könnten Sie einige Tage warten, bevor es von dort verfügbar ist ...
sbmpost
sbmpost, ich weise nur darauf hin, warum einige (nicht das, was ich getan habe) abstimmen, als Nicht eine Antwort markieren und dies löschen lassen würden.
Drew
Wenn es sich um Code handelt, den Sie im Text veröffentlichen können, ist das großartig. Können Sie? Dies ist eine Code-Site.
Drew
1
@drew: Hinweis zum Glas hinzugefügt und dem Code etwas mehr Kontext hinzugefügt. Es mag auf hohem Niveau erscheinen, aber wenn Sie FileDocumentManagerAdapter erweitern und den Code hinzufügen, haben Sie (fast) eine kompilierende ReformatAndCompile-Klasse.
sbmpost
1

Bearbeiten Sie Ihre Run / Debug-Konfiguration so, dass vor dem Start die Option Erstellen ausgewählt ist

Geben Sie hier die Bildbeschreibung ein

Die Option Nach dem Erstellen ist ausgewählt

Geben Sie hier die Bildbeschreibung ein

Die obige Lösung hat bei der Arbeit an meiner JBehave-Testsuite für mich funktioniert

Asanka Siriwardena
quelle
Das ist schön, aber die Frage war, ob beim Speichern automatisch kompiliert werden soll, ohne dass die Explizität mithilfe eines benutzerdefinierten Befehls erneut kompiliert werden muss, bevor ein Test usw. ausgeführt wird.
kisna
1

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 der automatischen Speicherung erstellen.

ZB: siehe Modul in

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Orkun Ozen
quelle
1

Ich hatte das gleiche Problem. Ich denke, es wäre angebracht zu prüfen, ob Ihre Klasse kompiliert werden kann oder nicht. Klicken Sie auf Neukompilieren (standardmäßig Strg + Umschalt + F9). Wenn es nicht funktioniert, müssen Sie untersuchen, warum es nicht kompiliert wird.

In meinem Fall wurde der Code nicht automatisch kompiliert, da beim Kompilieren versteckte Fehler aufgetreten sind (sie wurden nirgendwo in Protokollen angezeigt und die Neuinstallation von Maven funktionierte). Die Grundursache war eine falsche Projektstruktur -> Modulkonfiguration, sodass Intellij Idea sie nicht gemäß dieser Konfiguration erstellen konnte.

Sergei Podlipaev
quelle
1

Ich hatte das gleiche Problem und auch ein Problemdateisymbol in Intellij, also entfernte ich den .ideaOrdner und importierte das Projekt, um mein Problem zu beheben .

Jacob
quelle
0

Ich habe eine Fehlermeldung erhalten: Einige Gläser befinden sich nicht im Klassenpfad. Also lösche ich einfach das beschädigte Glas und führe die folgenden Schritte aus

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
Priyanshu Singh
quelle
-1

Nicht genug Punkte, um eine vorhandene Antwort zu kommentieren, aber ähnlich wie bei einigen der oben genannten Personen habe ich nur ein Makro und eine Keymap hinzugefügt, um Importe zu organisieren / Formatieren / SpeichernAll / FastReload (F9) / Synchronisieren .

Die Synchronisierung wird hinzugefügt, da dies die einzige Möglichkeit zu sein scheint, Aktualisierungen in Ressourcen zu sehen, die von externen Build-Tools / Beobachtern (dh Webpack) geändert wurden.

Der Prozess ist langsamer als Eclipse - und für die externe Dateiaktualisierung muss der Befehl häufig mehrmals ausgeführt werden - aber ich kann damit leben.

Lanze Fallon
quelle