java.lang.UnsupportedClassVersionError: Ungültige Versionsnummer in der Klassendatei?

140

Ich erhalte diesen Fehler, wenn ich eine OpenSource-Bibliothek einbinde, die ich aus dem Quellcode kompilieren musste. Alle Vorschläge im Web weisen darauf hin, dass der Code in einer Version kompiliert und in einer anderen Version ausgeführt wurde (neu auf alt). Ich habe jedoch nur eine Version von JRE auf meinem System. Wenn ich die Befehle ausführe:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

und checke in Eclipse nach den Eigenschaften der Java-Bibliothek, die ich bekomme 1.5.0_18

Daher muss ich zu dem Schluss kommen, dass etwas anderes, das innerhalb einer Klasse selbst liegt, die Ausnahme auslöst? Ist das überhaupt möglich?

grmn.bob
quelle
2
Haben Sie eine kompilierte Version der Bibliothek an einer anderen Stelle, die sich möglicherweise zuerst in Ihrem Klassenpfad befindet?
Jeff Storey
Gute Idee, aber nein. Ich habe eine Überprüfung mit 'find' durchgeführt. -name '* .jar' | xargs find 'aus dem lib-Ordner mit den JARs. Außerdem dachte ich nicht, dass Eclipse CLASSPATH verwendet? Irgendwelche anderen guten Vorschläge?
grmn.bob
Wie verwende ich diesen Befehl find -name '* .jar' auf cmd, wenn ich den jre src-Code erneut erstellen möchte ... und dafür muss ich diesen cmd auslösen ..... javalobby.org/java/forums /t103334.html.....my jdk befindet sich unter C: \ Programme \ Java \ jdk1.6.0_31
Learner

Antworten:

185

Ich habe gelernt, dass solche Fehlermeldungen normalerweise richtig sind. Wenn es (Ihrer Meinung nach) nicht möglich sein könnte, was der gemeldete Fehler sagt, suchen Sie in einem anderen Bereich nach einem Problem ... um Stunden später herauszufinden, dass die ursprüngliche Fehlermeldung tatsächlich richtig war.

Da Sie Eclipse verwenden, hat Thilo meiner Meinung nach Recht. Der wahrscheinlichste Grund, warum Sie diese Meldung erhalten, ist, dass eines Ihrer Projekte 1.6 Klassen kompiliert. Es spielt keine Rolle, ob Sie nur eine 1,5-JRE auf dem System haben, da Eclipse einen eigenen Compiler (nicht Javac) hat und nur eine 1,5-JRE benötigt, um 1,6-Klassen zu kompilieren. Es mag seltsam sein und eine Einstellung muss deaktiviert werden, um dies zu ermöglichen, aber ich habe es gerade geschafft.

Überprüfen Sie für das betreffende Projekt den Abschnitt Projekteigenschaften (normalerweise Alt + Eingabetaste), Java Compiler. Hier ist ein Bild eines Projekts, das für die Kompilierung von 1.6 konfiguriert ist, jedoch nur eine JRE von 1,5 aufweist.

Geben Sie hier die Bildbeschreibung ein

Joshua McKinnon
quelle
Stimme voll und ganz zu ... deshalb habe ich in meinem Kommentar die Frage gestellt, wie ich es genau bestimmen kann. Ich kannte die internen Klassen von Eclipse nicht. Die Bibliothek wurde in der Befehlszeile mit 'javac' kompiliert und in mein Eclipse-Projekt integriert. Ich werde versuchen, mein Projekt über die Befehlszeile zu kompilieren. Sie haben dieses Problem in der Vergangenheit eindeutig gelöst und Ihre Vorschläge sind fantastisch.
grmn.bob
3
Wenn Sie über das JDK (das Quellen enthält) verfügen, sollten Sie in der Lage sein, einige Haltepunkte in Eclipse hinzuzufügen und hoffentlich zu sehen, welche Klasse geladen werden soll. Der einfachste Weg ist wahrscheinlich ein Haltepunkt im Konstruktor für UnsupportedClassVersionError (oder ein Eclipse Exception-Haltepunkt, das Symbol 'J!'). Dann können Sie überprüfen, wie er dort angekommen ist.
Joshua McKinnon
OK. Ich fand einen Experten im Gebäude und er konnte Eclipse auf dieselbe JRE wie meine Befehlszeile verweisen. Ich habe dann gegen 1.6 umgebaut und bin gegen 1.6 gelaufen und es funktioniert alles. Offensichtlich habe ich mich geirrt, nichts anderes als 1,5 zu haben. Er zeigte mir, wo ich suchen sollte. Danke für die Hilfe - jetzt bin ich bei meinem nächsten Problem! :)
grmn.bob
2
Ich hatte das gleiche Problem. Der Fehler, den ich gemacht habe, war, dass ich 1.5 JRE und 1.6 Compiler verwendet habe. Damit wurde der nicht unterstützte Klassenumwandlungsfehler nicht behoben. Also habe ich die 1.6 JRE in meiner Eclipse installiert und den 1.6 Compiler verwendet. Dann fing alles an gut zu funktionieren.
Vanchinathan Chandrasekaran
1
Ich möchte dies ein zweites Mal positiv bewerten, da es das zweite Mal ist, dass ich das Problem hatte, gesucht, diese Antwort gefunden habe und es richtig war. > _ <
AlbeyAmakiir
9

Haben Sie versucht, eine vollständige "Bereinigung" durchzuführen und diese dann in Eclipse neu zu erstellen (Projekt-> Bereinigen ...)?

Können Sie mit "javac" und "java" direkt über die Befehlszeile kompilieren und ausführen? Funktioniert das richtig

Wenn Sie mit der rechten Maustaste auf Ihr Projekt klicken, gehen Sie zu "Eigenschaften" und dann zu "Java Build Path". Gibt es verdächtige Einträge unter einer der Registerkarten? Dies ist im Wesentlichen Ihr KLASSENPFAD.

In den Eclipse-Einstellungen möchten Sie möglicherweise auch den Abschnitt "Installierte JREs" im Abschnitt "Java" überprüfen und sicherstellen, dass er Ihren Vorstellungen entspricht.

Sie haben definitiv entweder eine veraltete .class-Datei, die irgendwo herumliegt, oder Sie erhalten eine Nichtübereinstimmung zwischen Kompilierungs- und Laufzeit in den von Ihnen verwendeten Java-Versionen.

Brent schreibt Code
quelle
ja (voll sauber); habe es nicht ausprobiert (Projekt von cmd line); vielleicht / nein (ich habe Einträge aus Eclipse "Java Build Path" entfernt); habe das gemacht (JREs - dort habe ich die Versionsnummer bekommen).
grmn.bob
5

Haben Sie mit Eclipse kompiliert? Es wird ein anderer Compiler verwendet (nicht Javac). Das sollte nicht zu diesem Fehler führen (wenn alles richtig konfiguriert ist), aber Sie können versuchen, ihn stattdessen mit javac zu kompilieren.

Wenn das Problem dadurch behoben wurde, versuchen Sie festzustellen, ob Eclipse falsche Compilereinstellungen aufweist. Lassen Sie es speziell auf Java 5 abzielen.

Thilo
quelle
Das lerne ich. Ich werde versuchen, die beiden Teile auf die gleiche Weise zu erstellen (cmd-Linie und / oder Sonnenfinsternis).
grmn.bob
1
Danke Thilo, ich habe heute viel über Eclipse und Java und Klassenversionen gelernt. Und ein bisschen über Ameise auch.
grmn.bob
2

Ich habe auch den gleichen Fehler bekommen. Grund dafür war, dass ich das Projekt mit Maven kompilierte. Ich hatte JAVA_HOME, das auf JDK7 zeigte, und daher wurde Java 1.7 zum Kompilieren verwendet, und als ich das Projekt ausführte, verwendete ich JDK1.5. Das Ändern des folgenden Eintrags in der .classpath-Datei oder das Ändern der Eclipse wie im Screenshot hat das Problem behoben.

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

oder ändern Sie die Ausführungskonfigurationen von Eclipse als Geben Sie hier die Bildbeschreibung ein

Vikky
quelle
1

Überprüfen Sie auch alle JAR-Dateien in Ihrem Projekt, die für eine höhere Version von Java kompiliert wurden. Wenn dies Ihre eigenen Bibliotheken sind, können Sie dies beheben, indem Sie das Zielversionsattribut in javac ändern

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">
Jeshurun
quelle
0

Ein weiteres Szenario, in dem dies passieren kann, ist das Starten einer Eclipse-Instanz (zum Debuggen usw.) von einer Host-Eclipse aus. In diesem Fall hilft es nicht, nur die Projektebene oder die JRE-Bibliothek im Klassenpfad des Projekts zu ändern. Was zählt, ist die JRE, die zum Starten der Ziel-Eclipse-Umgebung verwendet wird.

Jay
quelle
0

Überprüfen Sie immer auch das Offensichtliche. Ich habe diesen Fehler einmal erhalten, als ich versehentlich die falsche Ressource für die Aktion zum Hinzufügen und Entfernen des Servers abgerufen habe. Es kann leicht zu übersehen sein.

James Drinkard
quelle
0

Das Löschen der projektspezifischen Einstellungsdateien (Eclipse-Arbeitsbereich / Projektordner / .settings /) aus dem Projektordner reicht ebenfalls aus. Natürlich müssen wir ein Projekt nach dem Löschen bereinigen und erstellen.

user3471219
quelle
0

Ändern des Projekts zur Verwendung von Java 1.7: Damit dies funktioniert, gehen Sie folgendermaßen vor:

  • Ändern Sie die Compiler-Konformitätsstufe
  • Ändern Sie Ihre Projekte JRE / JDK auf etwas auf dem gleichen Niveau (1.7 in meinem Fall)
  • Nehmen Sie die gleiche Änderung in allen Projekten vor, auf die Ihr Projekt verweist
  • Ändern Sie Ihre Run / Debug-Konfiguration, um das JRE / JDK (oder dieselbe Stufe) zu verwenden.

Funktioniert nicht?

  • Projekte löschen Bin-Verzeichnis
  • Reinigen
  • neu bauen

Funktioniert immer noch nicht?

im Verzeichnis Ihres Projekts: Bearbeiten Sie .settings / org.eclipse.jdt.core.prefs> Stellen Sie sicher, dass Ihre Zielebene angewendet wird

Viel Glück!

Li3ro
quelle
0

Ich habe dieses Problem gelöst, indem ich den für den Server erforderlichen Wert geändert habe (in meinem Fall Tomcat). Doppelklicken Sie auf der Registerkarte Server in Eclipse auf den Server (um die Seite für die Serverkonfiguration zu öffnen), klicken Sie auf Laufzeitumgebung und ändern Sie die erforderliche JRE

ocrampico
quelle