Können neuere JRE-Versionen Java-Programme ausführen, die mit älteren JDK-Versionen kompiliert wurden?

80

Dies mag eine dumme Frage sein, aber würde ich Probleme beim Ausführen von Java-Programmen und zugehörigen Bibliotheken haben, die in Java Version 1.6 und 1.7 kompiliert wurden (ich kompiliere mit 1.7, während einige Bibliotheken mit 1.6 kompiliert werden) und das gesamte Programm in einer 1.7 JRE ausführen ?

Shawn
quelle

Antworten:

85

Sie würden keine Probleme haben - das ist die Magie von Java - es ist abwärtskompatibel. Sie können fast den gesamten Code von Java 1 auf Java 8 ausführen. Es gibt keinen Grund, warum Java 6-Code auf einer Java 8-Laufzeit nicht ausgeführt wird.

Interessant ist, dass für Anwendungen, die beispielsweise in Java 1.4 geschrieben sind, sogar Geschwindigkeitssteigerungen auftreten, wenn Sie sie zu späteren Laufzeiten ausführen. Dies liegt daran, dass sich Java ständig weiterentwickelt, nicht nur die als "Java" bekannte Sprache, sondern auch die JVM (Java Virtual Machine). Ich habe immer noch Quellcode von vor mehr als 10 Jahren, der immer noch funktioniert, wie in der neuesten JVM erwartet.

Wenn Sie beispielsweise eine Java 5-VM als Ziel festlegen möchten, können Sie dies mit den Java 8 SDK-Tools tun. Sie können letztendlich angeben, welche Ziel-VM Sie unterstützen möchten, sofern Sie berücksichtigen, dass eine VM der Version 5 möglicherweise nicht alle Funktionen einer VM der Version 8 unterstützt.

Ich habe gerade Code, den ich in Java 5 geschrieben habe, gegen die neue Java 8-Laufzeit getestet und alles funktioniert wie erwartet. Obwohl wir jetzt eine leistungsfähigere Sprache und Laufzeit haben, können wir unsere Investitionen der Vergangenheit weiterhin nutzen. Allein das macht Java zu einer großartigen Wahl für Unternehmen.

Ewald
quelle
Auch wenn die Hälfte meines Programms (einige Bibliotheken, die ich verwende) mit 1.6 und die andere Hälfte mit 1.7 kompiliert wurde, funktioniert es trotzdem?
Shawn
2
Wenn Sie es in einer Java 7-Laufzeit ausführen, ja. Es gibt keinen Grund dafür, nicht zu funktionieren.
Ewald
1
Wenn Sie mit JDK 7 entwickeln und die Anwendung als JDK 7-Anwendung kompilieren, funktioniert sie auf einer älteren Laufzeit nicht. Es gibt eine Reihe von Gründen, Benutzer zu bitten, ein Upgrade auf die neueste Laufzeit durchzuführen, hauptsächlich aus Sicherheitsgründen, aber auch aus Gründen der Leistung. Ich würde mich für Java 7 entscheiden, wenn ich kann. Es macht wenig Sinn, ältere Versionen zu unterstützen, es sei denn, Sie müssen es wirklich.
Ewald
1
-1 MagicDraw funktioniert nicht mit neueren Java-Versionen, selbst das Unternehmen hat ein Tutorial zum Downgrade von nomagic.com/files/Java%20downgrade%20tutorial.pdf
NeDark
3
Haben Sie das Bit über "Sie können fast den gesamten Code von Java 1 auf Java 8 ausführen" gesehen? Es gibt einige kleine Inkompatibilitäten, hauptsächlich in esoterischen Teilen der JVM. Insgesamt bleibt Java jedoch weiterhin sehr abwärtskompatibel.
Ewald
96

Wie bereits beantwortet sind Sie meist sicher und die meisten Produkte und 3 rd Party - Bibliotheken wird einfach Arbeit. Es gibt jedoch sehr seltene Fälle, in denen binäre Inkompatibilitäten ( solche, bei denen die mit älterem JDK kompilierte Klassendatei in der neueren JVM nicht ausgeführt werden kann ) zwischen JDK-Versionen eingeführt wurden.

Offizielle Liste der Oracle Java-Inkompatibilitäten zwischen Versionen:

Kompatibilitätswerkzeug

Im Lieferumfang von JDK 9 ist ein Tool namens jdeprscan enthalten, das die Kompatibilität überprüft, nicht mehr verwendete APIs in Ihrem Code auflistet und Alternativen vorschlägt (!). Sie können die Ziel- JDK-Version angeben (funktioniert für JDK 9 , 8 , 7 und 6 ) und es werden Inkompatibilitäten aufgelistet, die für Ihre Zielversion spezifisch sind.

Zusätzlicher Kommentar bei Bibliotheken:

Eine vernünftige Faustregel ist, die neueste stabile Release-Version der Bibliothek für die JRE-Version zu verwenden, auf die Ihre Software abzielt. Natürlich werden Sie viele Ausnahmen von dieser Regel finden, aber im Allgemeinen nimmt die Stabilität öffentlich verfügbarer Bibliotheken normalerweise mit der Zeit zu.

Natürlich müssen API-Kompatibilität und Versionsverwaltung berücksichtigt werden, wenn Versionen von Abhängigkeiten geändert werden.

Wiederum haben die meisten gängigen Abhängigkeiten Webseiten, auf denen solche Informationen verfügbar sein sollten.

Wenn Sie jedoch etwas Dunkleres verwenden, können Sie erkennen, für welche JRE die Klassen in Ihrer Abhängigkeit kompiliert wurden.

Hier ist eine großartige Antwort, wie Sie die Klassenversion herausfinden können . Möglicherweise müssen Sie zuerst die JAR-Datei entpacken.

diginoise
quelle
12
Eigentlich sollte dies die richtige Antwort sein, da ein Upgrade auf eine neuere Java-Version NICHT völlig sicher ist.
Dehlen
Was ist, wenn man keine JDK8-Funktionen verwendet? Kompilieren Sie 1.8 und Ziel 1.8. Wird es funktionieren?
Gaurav