JRE und JDK im Vergleich: JVM und passende Java-Pakete
Eine JRE (Java Runtime Environment) führt kompilierte Java-Programme aus. Ein JDK (Java Development Kit) bietet Laufzeitfunktionen sowie einen Compiler und Entwicklungstools. Wählen Sie also ein JDK, wenn Sie Java lernen oder Quellcode erstellen. Um eine vorhandene Anwendung auszuführen, folgen Sie ihren Laufzeitanforderungen; eine Anwendung, die ihre eigene Laufzeit enthält, benötigt möglicherweise keine separate Java-Installation.
Was ist eine JRE?
Eine JRE ist die Umgebung, die benötigt wird, um kompilierte Java-Programme auszuführen. Sie kombiniert eine JVM (Java Virtual Machine), Standard-Klassenbibliotheken und unterstützende Laufzeitdateien. Bytecode ist das von der JVM verwendete Befehlsformat, das üblicherweise in .class-Dateien gespeichert wird, die aus Java-Quellcode erzeugt wurden.
Ein typisches reines JRE-Laufzeitpaket stellt den javac-Quellcode-Compiler nicht zur Verfügung. In der Lage zu sein, java auszuführen, beweist daher nicht, dass Entwicklungswerkzeuge installiert sind. Außerdem sollte man das Konzept einer Laufzeitumgebung von den Paketnamen unterscheiden, die auf einer bestimmten Download-Seite verfügbar sind.
Was ist ein JDK?
Ein JDK liefert Werkzeuge zum Entwickeln und Ausführen von Java-Programmen. Verwenden Sie javac, um Quellcodedateien zu kompilieren, und java, um Programme auszuführen. Ein Entwicklungs-JDK bietet bereits Ausführungsfunktionen, sodass Sie keine zweite JRE-Installation benötigen, nur um Programme mit diesem JDK auszuführen.
javackompiliert.java-Quelldateien in.class-Dateien.javastartet die JVM und startet ein Java-Programm.jarpackt Klassen und Ressourcen in eine JAR (Java-Archiv)-Datei.javadocerzeugt API (Application Programming Interface)-Dokumentation aus Deklarationen und Dokumentationskommentaren.jdbunterstützt das Debuggen, einschließlich Anhalten der Ausführung und Inspektion von Variablen.
Das bedeutet nicht, dass ein JDK jeden Editor oder jede IDE (Integrierte Entwicklungsumgebung) enthält. Sie können einen Editor separat wählen, und eine IDE kann erfordern, dass Sie ein Projekt-JDK für das Kompilieren von Code auswählen. Die Rolle des Compilers wird in Oracles javac-Referenz beschrieben.
Wie hängen die JVM, JRE und JDK zusammen?
Die JVM ist die Komponente, die Bytecode ausführt. Eine JRE fügt Bibliotheken und unterstützende Dateien hinzu, um eine Laufzeitumgebung zu bilden; ein JDK fügt Entwicklungstools hinzu und bietet gleichzeitig Laufzeitfähigkeiten. Diese Begriffe beschreiben unterschiedliche Rollen und Anwendungsbereiche.
Zum Beispiel wandelt javac HelloWorld.java in HelloWorld.class um, und java HelloWorld startet das Programm auf einer JVM. Eine Klassendatei kann auf einem anderen Betriebssystem mit einer kompatiblen Laufzeit ausgeführt werden, aber Anwendungen, die native Bibliotheken oder bestimmte Java-Versionen verwenden, haben zusätzliche Anforderungen. Siehe die Einführung in die Java Virtual Machine-Spezifikation für die Beziehung zwischen der JVM und Klassendateien.
Vergleich JRE vs JDK
| Kriterium | Reines Laufzeitpaket (JRE) | JDK |
|---|---|---|
| Hauptzweck | Kompilierte Anwendungen ausführen | Anwendungen entwickeln, kompilieren und ausführen |
| JVM und Laufzeitbibliotheken | Inbegriffen | Inbegriffen |
| Java-Launcher | Typischerweise verfügbar | Verfügbar |
| Javac-Compiler | Typischerweise nicht vorhanden | Verfügbar |
| Wann man es wählen sollte | Eine Anwendung benötigt eine kompatible externe Laufzeit | Java lernen, Quellcode erstellen oder Entwicklungsarbeit |
| Verfügbarkeit zum Download | Abhängig vom Anbieter, der Version und dem Betriebssystem | Wählen Sie einen Anbieter und eine unterstützte Plattform |
Diese Tabelle vergleicht die üblichen Rollen eines rein zur Laufzeit bestimmten Pakets und eines Entwicklungskits. Eine benutzerdefinierte Laufzeitumgebung kann eine andere Auswahl an Modulen enthalten, sodass ihr Name allein nicht garantiert, dass jede Bibliothek oder jedes Werkzeug vorhanden ist.
Enthält ein modernes JDK einen JRE-Ordner?
„Das JDK enthält das JRE“ ist eine nützliche Kurzform für Laufzeitfähigkeiten, aber es ist keine genaue Beschreibung jeder aktuellen Verzeichnisstruktur. JDK 8 und frühere Versionen verwendeten ein internes jre/-Verzeichnis; JDK 9 führte modulare Laufzeitimages ein. Oracle bot mit JDK 11 keine separaten JRE- und Server-JRE-Downloads mehr an. Der Oracle JDK 11 Migrationsleitfaden erklärt diese Verpackungs- und Strukturänderungen.
Das bedeutet nicht, dass jeder Anbieter aufgehört hat, ausschließlich Laufzeitpakete zu vertreiben. Die Eclipse Temurin-Downloadseite unterscheidet zwischen JDK- und JRE-Paketen; prüfen Sie, was für die benötigte Version und das Betriebssystem tatsächlich verfügbar ist. Eine Änderung in der Paketierung durch einen Anbieter ist keine universelle Java-Regel.
Entwickler können auch das Tool jlink des JDK verwenden, um benötigte Module und deren Abhängigkeiten zu einem benutzerdefinierten Laufzeitabbild zusammenzustellen. Ein mit der Anwendung gebündeltes Laufzeitabbild kann eine separat installierte System-JRE überflüssig machen. Modulauswahl und Updates bleiben in der Verantwortung des Anbieters, wie die jlink-Referenz erläutert.
Welches Paket und welche Version sollten Sie wählen?
- Lernen und Entwicklung: Wählen Sie die für Ihren Kurs oder Ihr Projekt erforderliche JDK-Version, einschließlich der Versionen, die von Build-Tools und Bibliotheken unterstützt werden.
- Ausführen einer bestehenden Anwendung: Überprüfen Sie die Installationsanweisungen auf die erforderliche Java-Version und ob eine externe Laufzeitumgebung benötigt wird. Eine Änderung von System-Java kann bei einer Anwendung mit gebündelter Laufzeit wirkungslos sein.
- Serverbereitstellung: Stimmen Sie die erforderlichen Module, das Betriebssystem und die CPU-Architektur ab. Ein Server, der auch Quellcode erstellt oder JDK-Tools benötigt, kann ein JDK erfordern.
Eine höhere Versionsnummer allein garantiert keine Kompatibilität. Zum Beispiel kann eine Java-17-Laufzeit nicht unbedingt eine für Java 21 kompilierte Klasse lesen. Das Ausführen einer älteren Anwendung auf neuerem Java erfordert zudem das Überprüfen entfernter Funktionen und Bibliothekskompatibilität.
Für den eigenen Quellcode sollten Sie javac --release in Betracht ziehen, wenn Sie auf eine früher unterstützte Java-Version abzielen. Es schränkt Sprachfeatures, Plattform-APIs und die Ausgabe der Klassendatei ein, macht externe Abhängigkeiten jedoch nicht automatisch kompatibel. Testen Sie das Ergebnis auf der tatsächlichen Ziel-Laufzeitumgebung.
Installieren Sie ein JDK und überprüfen Sie die ausgewählten ausführbaren Dateien
Wählen Sie auf einer offiziellen Downloadseite Pakettyp, Java-Version, Betriebssystem und CPU-Architektur, etwa x64 oder ARM64. Wenn der Anbieter Prüfsummen bereitstellt, können Sie vor der Installation die heruntergeladene Datei anhand ihres Hashwerts prüfen.
Windows-Installation und Überprüfungen
Mit einem Eclipse Temurin MSI-Installer verwenden Sie Custom Setup, um das Installationsverzeichnis und die Funktionen auszuwählen. Das Hinzufügen von Java zu PATH erleichtert die Verwendung über die Kommandozeile; wählen Sie die JAVA_HOME-Funktion, wenn Ihre Build-Tools dies benötigen. Siehe die Temurin Windows-Installationsanleitung für diese Optionen. Nach der Installation schließen Sie vorhandene Terminals und öffnen ein neues.
java -version
javac -version
Überprüfen Sie, dass beide Befehle funktionieren und die beabsichtigte Java-Hauptversion melden. Wenn nur java -version funktioniert, wurde die Laufzeit gefunden, aber der Compiler ist möglicherweise nicht verfügbar. Überprüfen Sie in PowerShell die ausgewählten Pfade mit:
Get-Command java,javac | Select-Object Name,Source
PATH ist die Liste der Orte, an denen ein Terminal nach ausführbaren Dateien sucht. JAVA_HOME identifiziert einen JDK-Standort für Werkzeuge, die diese Variable verwenden; zeigen Sie auf das JDK-Stammverzeichnis, nicht auf sein bin-Verzeichnis. Wenn die beiden Einstellungen auf verschiedene Installationen verweisen, können ein Terminal und ein Build-Tool unterschiedliche Java-Versionen verwenden.
macOS- und Linux-Prüfungen
Verwenden Sie ein Paket oder einen Installer, der zu Ihrem Betriebssystem passt; konsultieren Sie die Temurin-Plattform-Installationsanleitungen für das tatsächliche Verfahren. Nach der Installation führen Sie java -version und javac -version aus. Um zu überprüfen, was Ihre Shell auflöst, verwenden Sie:
command -v java
command -v javac
Das Ergebnis kann ein symbolischer Link oder ein Speicherort des Versionsmanagers sein, ziehen Sie daher nicht allein aus einem Pfad auf die Java-Version. Überprüfen Sie auch das JDK des IDE-Projekts und das Build-Ergebnis. Das Auswählen eines neuen JDK pro Projekt vor der Deinstallation einer älteren Version erleichtert die Rückkehr zu einer funktionierenden Konfiguration.
Kompilierung und Ausführung an einem kleinen Beispiel
Mit einem verfügbaren JDK erstellen Sie ein leeres Arbeitsverzeichnis und speichern diese Quelle als HelloWorld.java. Stimmen Sie die Groß- und Kleinschreibung des Dateinamens mit dem Klassennamen ab und stellen Sie sicher, dass ein Editor keine .txt-Erweiterung hinzugefügt hat. Das Beispiel verwendet keine Paketdeklaration oder externen Bibliotheken.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
Öffnen Sie ein Terminal in dem Verzeichnis, das die Datei enthält, und führen Sie diese Befehle der Reihe nach aus:
javac HelloWorld.java
java -cp . HelloWorld
Der erste Befehl erstellt eine Klassendatei. Der zweite durchsucht das aktuelle Verzeichnis (.) nach der HelloWorld-Klasse und führt sie aus. Hängen Sie .class nicht an den Klassennamen an. Die erwartete Ausgabe ist:
Hello, Java!
JDK 11 und spätere Versionen können auch direkt eine Quelldatei mit java HelloWorld.java starten. Dies führt die Kompilierung intern durch, sodass der Name des Launchers nicht impliziert, dass ein ausschließlich zur Laufzeit bestimmtes JRE denselben Vorgang durchführen kann. Das Zwei-Schritte-Beispiel macht den Unterschied zwischen Quelle und Klasse sichtbar. Siehe den Java-Referenztext zur Ausführung von Quelldateien für die Bedingungen.
Um die kompilierte Klasse in eine ausführbare JAR-Datei zu verpacken, führen Sie Folgendes im selben Verzeichnis aus, nachdem HelloWorld.class erstellt wurde:
jar --create --file hello.jar --main-class HelloWorld HelloWorld.class
java -jar hello.jar
Das Erstellen des Archivs erfolgt mit einem Entwicklungstool; das Ausführen dieser fertigen JAR erfordert eine kompatible Laufzeitumgebung. Andere Anwendungen benötigen möglicherweise zusätzliche Bibliotheken oder Startoptionen. Siehe den jar-Befehlsreferenztext für Optionen zur Archivierung.
Häufige Installations- und Startprobleme beheben
| Symptom | Was zu überprüfen ist | Vorgehensweise |
|---|---|---|
| java oder javac wird nicht gefunden | Die ausführbare Datei existiert und PATH enthält das bin-Verzeichnis des vorgesehenen JDK | Öffnen Sie ein neues Terminal; überprüfen Sie die ausführbare Datei auch mit ihrem vollständigen Pfad |
| java funktioniert, javac nicht | Reines Laufzeitpaket oder vermischte Programmpfade | Installieren Sie ein Entwicklungs-JDK oder wählen Sie den Pfad eines vorhandenen JDK |
| UnsupportedClassVersionError | Ob die Laufzeitumgebung die Klassendateiversion unterstützt | Verwenden Sie eine kompatible Laufzeit; erstellen Sie Ihren eigenen Code für die Zielversion neu, falls dies angemessen ist |
| Could not find or load main class | Klassenname, Arbeitsverzeichnis und Klassenpfad | Für dieses Beispiel führen Sie java -cp . HelloWorld im Verzeichnis aus, das HelloWorld.class enthält |
| Funktioniert in der IDE, schlägt im Terminal fehl | Projekt-JDK versus Terminal-java und javac | Überprüfen Sie IDE, PATH, JAVA_HOME und die JDK-Auswahl des Build-Tools separat |
Stellen Sie bei der Fehlerdiagnose zuerst fest, welche ausführbare Datei tatsächlich gestartet wird. Sobald Pfade und Versionen stimmen und das kleine Beispiel funktioniert, prüfen Sie die Abhängigkeiten und Startoptionen der Anwendung.




