Java-Runtimes mit jlink
Microsoft erkennt die Verwendung benutzerdefinierter Java Runtimes an, die für spezifische Anwendungsanforderungen entwickelt wurden, und unterstützt diese anstelle der Verwendung allgemeiner Java Runtimes. Diese Methode der Bereitstellung von Java stellt sicher, dass die Java Runtime nur die Teile der Java-Plattform enthält, die von den Anwendungen wirklich benötigt werden. Dadurch wird die Sicherheit erhöht, die Größe der Bereitstellung reduziert und die Leistung verbessert, sowohl für Cloud- und serverbasierte Java-Anwendungen als auch für Desktop/GUI-Anwendungen.
Bisher produzierte Oracle/Sun Microsystems Installationsprogramme für die Java Runtime Environment (JRE), die ausschließlich die Java Virtual Machine, die Java-APIs und betriebssystem- und browserspezifische Integrationen enthielten, um Computer in die Lage zu versetzen, aus dem Internet heruntergeladene Java-Anwendungen auszuführen oder Applets und Java Web Start-Anwendungen über den Browser zu starten.
Mit dem Aufkommen moderner Webanwendungen und Browser wurden sowohl Applets als auch Java Web Start-Technologien eingestellt, und die Browser unterstützen keine Java-Plugins mehr. Der Bedarf an einer universellen Java Runtime Environments, die auf Computern vorinstalliert ist, wurde im Laufe der Zeit immer geringer. Mit Java 9 wurde die Applet-API eingestellt (siehe JEP 289) und mit Java 17 wurde die API zur Entfernung markiert, was bedeutet, dass sie mit Sicherheit in einer zukünftigen Version von Java entfernt werden wird.
Eine weitere wichtige Änderung ist die Modularisierung von Java, die ebenfalls mit der Version Java 9 begonnen hat (siehe JSR 376). Im Rahmen dieser Änderung können Entwicklerinnen und Entwickler nun eine neu hinzugefügte Befehlszeile im JDK mit dem Namen jlink
verwenden, um eine benutzerdefinierte Java Runtime zu erstellen, die speziell auf die Bedürfnisse von Anwendungen zugeschnitten ist und als integrierte eingebettete Runtime zusammen mit dem Anwendungscode bereitgestellt wird – oft als Teil eines Container-Images für Cloud-basierte Workloads oder als Teil von Installationsprogrammen für GUI-basierte Anwendungen.
Heute wird Minecraft: Java Edition Millionen von Minecraft-Spielerinnen und -Spielern mit einer in das Spiel eingebetteten Java Runtime zur Verfügung gestellt. Auch hinter Online-Diensten wie LinkedIn, Yammer, Bing und Azure setzt Microsoft Hunderttausende von JVMs mit dieser Technik ein.
Erstellen einer benutzerdefinierten Java-Runtime
Um eine Java Runtime zu erstellen, müssen Sie JDK 9 oder höher in Ihrer Umgebung installiert haben. Laden Sie zuerst den Microsoft Build von OpenJDK herunter und installieren Sie ihn.
Identifizieren erforderlicher Module mit jdeps
Die Java-Plattform ist jetzt in Module unterteilt. Eine vollständige Liste finden Sie in der Dokumentation von Java 17. Andere Versionen von Java können neue Module enthalten.
Das JDK-Tool jdeps
kann verwendet werden, um eine .class
-Datei, ein Verzeichnis oder eine JAR
-Datei zu analysieren, um Java-Modulabhängigkeiten, JDK-interne Abhängigkeiten und andere nützliche Informationen zu identifizieren, die Entwicklerinnen und Entwicklern beim Erstellen von Java Runtimes helfen.
$ cat HelloWorld.java
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
$ jdeps HelloWorld.class
HelloWorld.class -> java.base
<unnamed> -> java.io java.base
<unnamed> -> java.lang java.base
Das Tool jdeps
gibt an, dass diese Klasse nur von Typen in den Paketen java.lang
und java.io
abhängt, daher benötigt sie nur das Modul java.base
. Eine ähnliche Ausgabe würde für eine JAR
-Datei als Eingabe erstellt werden. Mit einer Liste der erforderlichen Module können Sie jetzt eine Java Runtime erstellen.
Erstellen einer Java Runtime mit jlink
Um eine Java Runtime aus dem JDK zu erstellen, müssen Sie wissen, welche Module Sie benötigen. Verwenden Sie jdeps
, um sie zu identifizieren. Ausführliche Informationen zum Befehlszeilentool jlink
finden Sie in der Dokumentation.
Beispiel:
$ jlink \
--add-modules java.base \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output /javaruntime
Sie können nun die Java Runtime verwenden, die sich unter /javaruntime
befindet, um den Anwendungscode auszuführen, der vom Modul java.base
abhängig ist. Die Struktur des von javaruntime
erzeugten Ordners jlink
ähnelt der Verzeichnisstruktur des JDK und das Befehlszeilentool java
zum Starten der JVM befindet sich wie üblich im Ordner ./bin/
. Wenn eine benutzerdefinierte Java Runtime alle erforderlichen Module einer bestehenden Anwendung enthält, kann sie von JAVA_HOME
referenziert werden.
$ /javaruntime/bin/java HelloWorld
Hello, World!
In dem obigen Beispiel verbraucht die erzeugte Java Runtime unter Windows etwa 24 MB.
Erstellen einer Java Runtime mit Docker-Containerimage
Sie können mehrstufige Docker-Builds verwenden, um die benutzerdefinierte Java Runtime als Teil Ihres Image-Builds zu erstellen, zu konsumieren und zu packen. Weitere Informationen finden Sie unter Java Runtimes mit Docker erstellen.
Knowledge Base
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Unter Java-Sicherheit und Kryptographie finden Sie eine Erklärung, wie Sie dieses Problem beheben können.
Ressourcen
Geben Sie Feedback zum Microsoft Build von OpenJDK
Senden Sie uns Ihre Kommentare, Gedanken und Ideen, damit wir den Microsoft Build von OpenJDK verbessern können. Besuchen Sie unsere OpenJDK-Diskussionsseite auf GitHub, um uns Ihr Feedback zu senden.
Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder dessen Tochtergesellschaften.