Java: Ungelöstes Kompilierungsproblem

76

Was sind die möglichen Ursachen für ein "java.lang.Error: Ungelöstes Kompilierungsproblem"?

Zusätzliche Information:

Ich habe dies gesehen, nachdem ich eine Reihe aktualisierter JAR-Dateien aus einem Build auf die vorhandenen JARs kopiert und die Anwendung neu gestartet habe. Die JARs werden mithilfe eines Maven-Erstellungsprozesses erstellt.

Ich würde erwarten, dass LinkageErrors- oder ClassNotFound-Fehler auftreten, wenn sich die Schnittstellen ändern. Der obige Fehler weist auf ein Problem niedrigerer Ebene hin.

Ein sauberer Umbau und eine erneute Bereitstellung haben das Problem behoben. Könnte dieser Fehler auf eine beschädigte JAR hinweisen?


quelle
Was haben Sie getan, um diesen Fehler zu verursachen?
Greg Hewgill
Ich habe diesen Fehler verursacht, indem ich einen Eingabeparameter umbenannt habe und nicht alle Vorkommen dieses Parameters in einer Methode umbenannt habe. Interessanterweise verursacht mvn compiledies keinen Fehler, das Ausführen des Programms jedoch. mvn clean compilezeigt den Fehler während der Kompilierung (wie erwartet).
Peschü

Antworten:

67

(umgeschrieben am 28.07.2015)

Das Standardverhalten von Eclipse beim Kompilieren von Code mit Fehlern besteht darin, Bytecode zu generieren, der die angezeigte Ausnahme auslöst, sodass das Programm ausgeführt werden kann. Dies ist möglich, da Eclipse anstelle des javacvon Apache Maven verwendeten JDK einen eigenen integrierten Compiler verwendet und die Kompilierung aufgrund von Fehlern vollständig fehlschlägt. Wenn Sie Eclipse in einem Maven-Projekt verwenden, mit dem Sie auch über den mvnBefehlszeilenbefehl arbeiten, kann dies passieren.

Die Lösung besteht darin, die Fehler zu beheben und neu zu kompilieren, bevor Sie sie erneut ausführen.

Die Einstellung ist in diesem Screendump mit einem roten Kästchen markiert:

Eclipse-Einstellungen unter OS X.

Thorbjørn Ravn Andersen
quelle
Das ist nicht mein Fall. Ich habe dies gesehen, nachdem ich JAR-Dateien (mit Maven erstellt) auf einem Server bereitgestellt habe.
1
Möglicherweise liegt ein Problem mit Ihrer Maven-Build-Konfiguration vor und es werden .class-Dateien aus Ihrem Eclipse-Ausgabeverzeichnis verwendet. Jedenfalls habe ich diesen Fehler nur gesehen, wenn Code mit Kompilierungsfehlern in Eclipse ausgeführt wurde.
Michael Borgwardt
In diesem Fall ist Ihr Maven-Build höchstwahrscheinlich kaputt. Versuchen Sie, über die Befehlszeile zu bereinigen und neu zu kompilieren, während Eclipse heruntergefahren ist.
Thorbjørn Ravn Andersen
Ich habe nicht gesehen, dass Sie die Frage bearbeitet haben. Ich würde den Maven-Build-Prozess erneut untersuchen, da er nicht vollständig sauber zu sein scheint. Es sollte NICHT in der Lage sein, zerbrochene Gläser zu erstellen! Hast du einen Build Server?
Thorbjørn Ravn Andersen
Ich hatte gerade das gleiche Problem. Wie Michael sagte, war dies Maven, der die von Eclipse generierten Klassendateien aufnahm.
Wouter Coekaerts
14

Versuchen Sie, das Eclipse-Projekt zu bereinigen

micahli123
quelle
9

Sie versuchen nur, Maven auf Befehl zu reinigen

mvn clean

und danach folgenden Befehl

mvn eclipse:clean eclipse:eclipse

und baue dein Projekt neu auf ....

jaideep
quelle
Angesichts der aktuellen Qualität (2015) des m2e Eclipse-Plugins würde ich vorschlagen, anstelle der verschiedenen Eclipse-Maven-Ziele eine Eclipse mit dieser zu verwenden.
Thorbjørn Ravn Andersen
8

Ihre kompilierten Klassen müssen möglicherweise mit den neuen Jars aus der Quelle neu kompiliert werden.

Versuchen Sie, "mvn clean" auszuführen und dann neu zu erstellen

Steve Pearson
quelle
2

Der größte Teil wird von Thorbjørn Ravn Andersen richtig beantwortet.

Diese Antwort versucht, die verbleibende Frage zu beleuchten: Wie könnte die fehlerhafte Klassendatei im Glas landen?

Jeder Build (mvn & javac oder eclipse) signalisiert auf seine spezifische Weise, wenn ein Kompilierungsfehler auftritt, und lehnt es ab, eine Jar-Datei daraus zu erstellen (oder Sie zumindest prominent zu benachrichtigen). Die wahrscheinlichste Ursache für das unbeaufsichtigte Abrufen von Klassendateien mit Fehlern in einem JAR ist die gleichzeitige Ausführung von Maven und Eclipse.

Wenn Sie Eclipse geöffnet haben, während Sie einen MVN-Build ausführen, sollten Sie Projekt > Automatisch erstellen deaktivieren, bis MVN abgeschlossen ist.

EDIT : Lassen Sie uns versuchen, das Rätsel in drei Teile zu teilen:

(1) Was bedeutet "java.lang.Error: Ungelöstes Kompilierungsproblem"

Dies wurde von Thorbjørn Ravn Andersen erklärt. Es besteht kein Zweifel, dass Eclipse beim Kompilieren einen Fehler gefunden hat .

(2) Wie kann eine von Eclipse kompilierte Klassendatei in eine von maven erstellte JAR-Datei gelangen (vorausgesetzt, Maven ist nicht für die Verwendung von ecj zum Kompilieren konfiguriert)?

Dies kann entweder durch Aufrufen von maven ohne oder mit unvollständiger Reinigung geschehen. Oder ein automatischer Eclipse-Build könnte auf Änderungen im Dateisystem (von maven durchgeführt) reagieren und eine Klasse neu kompilieren, bevor maven Klassendateien in der JAR sammelt ( dies habe ich in meiner ursprünglichen Antwort mit "gleichzeitiger Vorgang" gemeint ).

(3) Wie kommt es, dass ein Kompilierungsfehler vorliegt, der jedoch mvn cleanerfolgreich ist?

Wieder mehrere Möglichkeiten: (a) Compiler sind sich nicht einig, ob der Quellcode legal ist oder nicht, oder (b) Eclipse kompiliert mit fehlerhaften Einstellungen wie unvollständigem Klassenpfad, falscher Java-Konformität usw. So oder so eine Sequenz von Aktualisierung und Bereinigung in Eclipse sollte das Problem auftauchen.

Stephan Herrmann
quelle
Ich denke nicht, dass dies ein Problem der Parallelität ist, da es sehr systematisch ist und immer passiert. Ich denke, irgendwie wird der Code beim Laden bei Bedarf kompiliert, wenn er wirklich von der JVM verwendet wird. Keine Ahnung warum das möglich ist. Ich dachte, dass die Überprüfung der Kompilierungszeit Java zu einem Vorteil gegenüber Python macht ...
peschü
1

Ich hatte diesen Fehler, als ich eine Startkonfiguration mit einem ungültigen Klassenpfad verwendete. In meinem Fall hatte ich ein Projekt, das ursprünglich Maven verwendete, und daher enthielt eine Startkonfiguration ein Maven-Klassenpfadelement. Ich hatte das Projekt später geändert, um Gradle zu verwenden, und den Maven-Klassenpfad aus dem Klassenpfad des Projekts entfernt, aber die Startkonfiguration verwendete ihn weiterhin. Ich habe diesen Fehler beim Ausführen erhalten. Durch Bereinigen und erneutes Erstellen des Projekts wurde dieser Fehler nicht behoben. Bearbeiten Sie stattdessen die Startkonfiguration, entfernen Sie das Projektklassenpfadelement und fügen Sie das Projekt wieder zu den Benutzereinträgen im Klassenpfad hinzu.

djb
quelle
0

Ich habe diesen Fehler mehrmals erhalten und mich bemüht, ihn zu lösen. Schließlich entfernte ich die Ausführungskonfiguration und fügte die Standardeinträge wieder hinzu. Es hat wunderbar funktioniert.

Vinh
quelle
Nun ja ... aber das zu tun, was in der akzeptierten Antwort steht, hätte schneller funktioniert. Es ist nur eine einzige Flagge in den Einstellungen.
Stephen C
-2

Stellen Sie sicher, dass Sie nicht verfügbare Bibliotheken (JAR-Dateien) aus dem Erstellungspfad entfernt haben

user1729564
quelle
Es wäre einfacher zu sagen "Beheben Sie die Kompilierungsfehler unabhängig von ihrer Ursache". Es gibt viele mögliche Ursachen für Kompilierungs- / Erstellungsfehler. Wir müssen sie nicht aufzählen.
Stephen C