Java-Runtimes mit jlink

Microsoft bestätigt und unterstützt die Einführung benutzerdefinierter Java-Runtimes, die für bestimmte Anwendungsanforderungen entwickelt wurden, anstatt allgemeine Java-Runtimes zu verwenden. Diese Methode der Java-Bereitstellung stellt sicher, dass die Java-Runtime nur die Teile der Java-Plattform enthält, die wirklich von Anwendungen benötigt werden. Dadurch wird die Sicherheit erhöht, die Bereitstellungsgröße reduziert und die Leistung sowohl für cloud- als auch serverbasierte Java-Anwendungen sowie Desktop-/GUI-Anwendungen verbessert.

In der Herkömmlichen werden von Oracle/Sun Microsystems jre-Installationsprogramme (Java Runtime Environment) erzeugt, die ausschließlich die Java Virtual Machine- und Java-APIs sowie betriebssystem- und browserspezifische Integrationen enthalten, um Computer für die Ausführung von java-Anwendungen zu aktivieren, die aus dem Internet heruntergeladen wurden, oder um Applets- und Java Web Start-Anwendungen über den Browser ausführen zu können.

Mit der Einführung moderner Webanwendungen und Browser sind sowohl Applets als auch Java Web Start-Technologien veraltet, und Browser unterstützen keine Java-Plug-Ins mehr. Die Notwendigkeit einer allgemeinen Java Runtime-Umgebung, die auf Computern vorinstalliert ist, wurde im Laufe der Zeit weniger wichtig. Mit Java 9 wurde die Applet-API veraltet (siehe JEP 289),und mit Java 17 wurde die API zum Entfernen markiert, was bedeutet, dass sie in einer zukünftigen Version von Java sicherlich entfernt wird.

Eine weitere wichtige Änderung ist die Modularisierung von Java,die ebenfalls mit dem Java 9-Release gestartet wurde (siehe JSR 376). Im Rahmen dieser Änderung können Entwickler jetzt eine neu hinzugefügte Befehlszeile im JDK namens verwenden, um eine benutzerdefinierte Java-Runtime zu erstellen, die speziell auf die Anforderungen von Anwendungen zugeschnitten ist und als integrierte eingebettete Runtime zusammen mit dem Anwendungscode häufig als Teil eines Containerimages für jlink cloudbasierte Workloads bereitgestellt wird. oder als Teil von Installationsprogrammen für GUI-basierte Anwendungen.

Heute wird Minecraft: Java Edition für Millionen von Minecraft-Gamern mit einer benutzerdefinierten Java-Runtime bereitgestellt, die in das Spiel eingebettet ist. Hinter Onlinedienste wie LinkedIn, Yammer, Bing und Azure stellt Microsoft mit dieser Technik auch Hunderttausende von JVMs zur Verfügung.

Erstellen einer benutzerdefinierten Java-Runtime

Zum Erstellen einer Java-Runtime muss JDK 9 oder höher in Ihrer Umgebung installiert sein. Laden Sie zuerst den Microsoft Build von OpenJDK herunter, und installieren Sie den Build.

Identifizieren der erforderlichen Module mit jdeps

Die Java-Plattform ist jetzt in Module unterteilt. Eine vollständige Liste finden Sie in der Dokumentation zu Java 17. Andere Versionen von Java können neue Module enthalten.

Das JDK-Tool kann verwendet werden, um eine Datei, ein Verzeichnis oder eine Datei zu analysieren, um Abhängigkeiten von jdeps Java-Modulen, interne JDK-Abhängigkeiten und andere nützliche Informationen zu identifizieren, die Entwickler beim Erstellen von .class JAR Java-Runtimes unterstützen.

$ 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 gibt an, dass diese Klasse nur von Typen in den Paketen und abhängt, daher benötigt jdeps sie nur das Modul java.lang java.io java.base . Eine ähnliche Ausgabe würde für eine Datei JAR als Eingabe erzeugt werden. Mit einer Liste der erforderlichen Module können Sie jetzt eine Java-Runtime erstellen.

Um eine Java-Runtime aus dem JDK zu erstellen, müssen Sie wissen, welche Module Sie verwenden möchten. Verwenden Sie jdeps , um sie zu identifizieren. Weitere Informationen zum jlink Befehlszeilentool 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 jetzt die Java-Runtime unter /javaruntime verwenden, um den Anwendungscode auszuführen, der vom Modul java.base abhängig ist. Die Struktur des von erzeugten Ordners ähnelt der javaruntime JDK-Verzeichnisstruktur, und das Befehlszeilentool zum Starten der JVM befindet sich wie gewohnt jlink java im Ordner ./bin/ . Wenn eine benutzerdefinierte Java-Runtime alle erforderlichen Module einer vorhandenen Anwendung enthält, kann von auf sie verwiesen JAVA_HOME werden.

$ /javaruntime/bin/java HelloWorld
Hello, World!

Im obigen Beispiel verbraucht die erzeugte Java-Runtime Windows 24 MB auf Windows.

Erstellen einer Java-Runtime mit dem Docker-Containerimage

Sie können mehrstufige Docker-Builds verwenden, um die benutzerdefinierte Java-Runtime als Teil Ihres Image-Builds zu erstellen, zu nutzen und zu packen. Erfahren Sie, wie Sie Java-Runtimes mit Docker erstellen.

Knowledge Base

javax.net.ssl.SSLHandshakeException: Schwerwiegende Warnung empfangen: handshake_failure

Wenn Sie eine Bibliothek verwenden, die versucht, eine sichere Verbindung herzustellen, stellen Sie sicher, dass das Modul jdk.crypto.ec in der Java-Runtime enthalten ist. Weitere Informationen finden Sie unter kubernetes-client/java#893.

Ressourcen

Bereitstellen von Feedback zum Microsoft Build von OpenJDK

Senden Sie uns Ihre Kommentare, Gedanken und Ideen, um uns bei der Verbesserung des Microsoft-Build von OpenJDK zu unterstützen. 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.