2015-07-01 9 views
12

Meine JDK Version jdk1.8.0_45 ist, und ich habe eine Anwendung mit der Standard-JDK-Konformität in Eclipse Einstellung gebaut.Angeben kleinere Version in JDK Einhaltung Eclipse

Aber mein Kollege hat eine JRE mit Version jre1.8.0_20. Also, wenn meine Anwendung in seinem System ausgeführt wird, wird es ein

java.lang.UnsupportedClassVersionError Unsupported major.minor version 52.0 

werfen Wenn ich die Anwendung mit JDK Compliance auf 1.7 bauen, es funktioniert offensichtlich gut. Aber ich möchte nicht alle Funktionen von JDK 8 verlieren, nur für eine geringfügige Versionskonflikt.

Und in Eclipse Ich bin nicht in der Lage eine kleinere Version Konformitätsstufe einzustellen. Ist es möglich, es einzustellen ???

Oder ist Java vorwärtskompatibel mit Minor-Versionen? Wenn ja, sollte dieser Fehler offensichtlich nicht auftreten, glaube ich.

+0

das ist seltsam. 'Ich habe eine Anwendung mit der Standard-JDK-Compliance-Einstellung in Eclipse erstellt, die welche Version war? Sind Sie sicher, dass Ihr Kollege jre8 benutzt? Hast du die Ausgabe von 'java -version' überprüft? – Paizo

+0

@Paizo, Mein JDK ist '1.8.0_45' und die Version meines Kollegen ist' 1.8.0_20'. Ich habe alle Informationen in der Frage angegeben ... – Codebender

Antwort

1

Java ist bekannt für rückwärtskompatibel Bedeutung sein, dass jede Anwendung, die Sie in einem älteren jdk bauenrunnable im neueren jdk wird:

Aufbau einer App in jdk1.6 oder jdk1.7 funktioniert, wenn mit jdk1.8 ausgeführt wird; Leider funktioniert das nicht andersrum ...

Minor Releases werden als neue Versionen von jdk angesehen und die Probleme der Kompatibilitäten treffen zu.

+0

Aber wie kann ich Compliance-Level für diesen Fall angeben ??? – Codebender

+0

Sie könnten versuchen, das -target-Compiler-Flag zu verwenden, das besagt, dass es Code generiert, der auf einer älteren (Ziel-) JVM ausgeführt wird, und das Compiler-Flag -source sagt, dass es nur die Sprachfunktionen der älteren JVM akzeptiert. Beachten Sie, dass dies je nach den von Ihrem Code verwendeten Java-Sprachfeatures nicht immer funktioniert. – Kibadachi

+0

Ich bin nicht in der Lage, die gesamte Version Informationen in diesem ... Wenn Sie auf meine Frage, beide JDK und JRE sind Version 1.8 ... Nur Unterschied ist der letzte Teil der Version. Wenn ich das in der '-source'-Option gebe, gibt es eine ** ungültige Quellenfreigabeoption: 1.8.0_45 ** – Codebender

1

Kein Weg.

Installieren Sie einfach jdk1.8.0_20 und wählen Sie es in Installierte JRE.

3

Sie sollten eine Runtime "Execution-environment" Versionsabhängigkeit anstelle einer bestimmten Java-Version angeben.

für ein Plugin in der manifest.mf, Ausführungsumgebung angeben: JavaSE-1.8

Für ein reines Java-Projekt, in "Build-Pfad ...-> Configure BuildPath" go to "Bibliotheken", dann " Fügen Sie "Library", "JRE System Library", "Execution Environment" hinzu und wählen Sie JavaSE-1.8. Entfernen Sie alle anderen JRE auf dem Pfad.

Das sagt zu Eclipse, finden Sie eine Java> = 1.8-konform JRE.

+0

Es ist auch möglich, dass dein Kollege mehrere JRE in seiner Eclipse installiert und konfiguriert hat (Check in "Window-> Preferences-> Java-> Installierte JRE "), einige von ihnen älter, und dass die Standard-JRE-Einstellung auf seiner Maschine tatsächlich <= 1,7 ist (zB weil JDK für dev enthalten ist), obwohl er neueren Java hat. –

2
  1. Download JRE 1.8.0_20

  2. Dann geben JRE 1.8.0_20 IDE Eclipse, so etwas wie dieses:

    enter image description here

  3. dann Ihre Anwendung neu zu bauen.

(Ihr Problem ist kein Fehler: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8124517)

+0

Guter Link zum Java-Bug. Aber deine Antwort wird das Problem nicht lösen. Wenn sein Kollege wirklich JRE 1.8.0_20 verwendet, würde diese Ausnahme nicht ausgelöst. Nach Ihrem Link: "Dieses Problem scheint durch das Ausführen von Eclipse Java 1.7 mit der Java 1.8 jfxrt.jar verursacht werden." –

6

Nach this Version 52.0 ist JDK-8. Es scheint, dass es eine Zahl ist, die abhängig vom JDK in die .class-Dateien kompiliert wird. JDK-7 verfügt über 51, JDK-6 verfügt über 50 usw.

ich die Ausführung angeben würde auf Maschine Ihre Kollegen das hat ein JDK/JRE nicht verwenden 8.

Versuchen java -XshowSettings auf Ihrem collegues PC laufen und prüfen Sie die Ausgabe der Linie java.class.version - wenn es ein JDK 7 ist, zeigt es java.class.version = 51.0.

+0

Die Tatsache, dass das OP einen java.lang.UnsupportedClassVersionError (und keine Eclipse-Ausnahme irgendeiner Art) erhält, unterstützt diese Antwort. –

1

Der Fehler tritt nur auf, wenn Sie größere Versionsänderungen wie von 6 bis 7 oder 7 bis 8 haben. Es tritt nicht für geringfügige Versionsänderungen auf, wie Sie haben. Und Fehler 52 dient zum Ausführen von JDK8-Code in JRE7. Überprüfen Sie daher die Einstellungen und stellen Sie JRE8 als Laufzeitumgebung ein.

1

Ich und meine Kollegin konfrontiert dies, wenn Sie x32 und x64-Versionen von JDK verwenden. Er benutzt Mac, daher ist nur x64 verfügbar (für Java 8), ich benutze M $ und habe beide Versionen. Wir müssen auf 64-Bit-Versionen entwickeln, andernfalls werden wir den gleichen Fehler zu sehen, wie Sie tun ...

+0

Das ist interessant und seltsam, es sei denn, Sie haben nativen Code (JNI/JNA-Zugriff oder Maschinencode kompiliert) für eine bestimmte arcitechture) Java-Code wird in einer 32-Bit- und 64-Bit-JVM gleich gut laufen. " – Lonzak

+0

Ja, unser Mentor unserer Arbeit konnte auch nicht sagen. Wir hatten das Problem vor einer Weile (ca. 6 Monate zurück). Wir benutzten tatsächlich eine Third-Party-Bibliothek (die nur im x32-Modus verwendbar war), aber nichtsdestoweniger sahen wir diese Fehlermeldung mehr als einmal: Es war generell ein Chaos mit MacOSX, das nur x64 Java (außer gebündelt) und Bibliotheken von Stoneage erlauben nur x32, immerhin haben wir es irgendwie geschafft, es zu betreiben, obwohl wir einen Guide veröffentlichen müssen, wie jemand es jemals starten kann :) – m4mbax

1

können Sie

(a) 1.8.0_20 auf Ihrem System installieren und überprüfen Sie die Klassenversion der resultierenden Klasse Dateien mit dem Code unten oder

(b) bauen Sie Ihre Anwendung auf dem System Ihres Kollegen und überprüfen Sie die resultierende Klassenversion mit dem Code unten.

public void checkClassVersion(File classFile) throws IOException{ 

    DataInputStream in = new DataInputStream(new FileInputStream(file)); 

    int magic = in.readInt(); 
    if(magic != 0xcafebabe) { 
     System.err.println(file.getName() + " is not a valid class!");; 
    } 
    int minor = in.readUnsignedShort(); 
    int major = in.readUnsignedShort(); 
    in.close(); 

    System.out.println(classFile.getName()+" = "+major+"."+minor); 
} 
Verwandte Themen