Java-Runtimes mit jlink

Microsoft erkennt an und unterstützt die Einführung von benutzerdefinierten Java-Runtimes, die für bestimmte Anwendungsanforderungen erstellt wurden, sondern die Verwendung allgemeiner Java-Runtimes. 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, wodurch die Sicherheit erhöht, die Bereitstellungsgröße reduziert und die Leistung für Cloud- und serverbasierte Java-Anwendungen sowie Desktop-/GUI-Anwendungen erhöht wird.

Traditionell würden Oracle/Sun Microsystems Java Runtime Environment (JRE)-Installer produzieren, die ausschließlich den virtuellen Java-Computer, die Java-APIs und betriebssystemspezifische Integrationen enthalten, die darauf abzielen, Computer für das Ausführen von Java-Anwendungen, die aus dem Internet heruntergeladen wurden, oder zum Ausführen von Applets und Java Web Start-Anwendungen über den Browser zu ermöglichen.

Mit der Einführung moderner Webanwendungen und Browser wurden Applets und 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 zu weniger erheblichen Überstunden. Mit Java 9 wurde die Applet-API veraltet (siehe JEP 289) und mit Java 17 wurde die API zur Entfernung markiert, was bedeutet, dass sie sicherlich auf einer zukünftigen Version von Java entfernt werden wird.

Eine weitere bedeutende Änderung ist die Modularisierung von Java, die auch mit der Java 9-Version begonnen hat (siehe JSR 376). Im Rahmen dieser Änderung können Entwickler nun eine neu hinzugefügte Befehlszeile im JDK jlink verwenden, um eine benutzerdefinierte Java-Runtime zu erstellen, die speziell auf die Anforderungen von Anwendungen ausgelegt ist, um als integrierte eingebettete Runtime zusammen mit dem Anwendungscode bereitgestellt zu werden, häufig als Teil eines Containerimages für cloudbasierte Workloads, oder als Teil der Installationsprogramme für GUI-basierte Anwendungen.

Heute wird Minecraft: Java Edition für Millionen von Minecraft-Spielern mit einer benutzerdefinierten Java-Runtime bereitgestellt, die in das Spiel eingebettet ist. Hinter Onlinedienste wie LinkedIn, Yammer, Bing und Azure stellt Microsoft auch Hunderte von Tausenden von JVMs mithilfe dieser Technik bereit.

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 es .

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 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 java.lang und java.io Paketen 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.

Um eine Java-Runtime aus dem JDK zu erstellen, müssen Sie wissen, welche Module Sie benötigen. Wird verwendet jdeps , um sie zu identifizieren. Ausführliche 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 nun die Java-Runtime verwenden, die sich befindet /javaruntime , um den Anwendungscode auszuführen, der vom java.base Modul abhängig ist. Die Struktur des von jlink ihnen javaruntime erstellten Ordners ähnelt der JDK-Verzeichnisstruktur, und das java Befehlszeilentool zum Starten des JVM befindet sich wie gewohnt im ./bin/ Ordner. Da eine benutzerdefinierte Java-Runtime alle erforderlichen Module einer vorhandenen Anwendung enthält, kann darauf verwiesen JAVA_HOMEwerden.

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

Im obigen Beispiel verbraucht die produzierte Java-Runtime unter Windows etwa 24 MB.

Erstellen einer Java-Runtime mit Docker-Containerimage

Sie können Docker-Mehrstufige Builds verwenden, um die benutzerdefinierte Java-Runtime als Teil Ihres Imagebuilds 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

Besuchen Sie Java Security und Kryptografie , um eine Erläuterung zur Behebung dieses Problems zu erfahren.

Ressourcen

Feedback zum Microsoft Build of OpenJDK

Senden Sie uns Ihre Kommentare, Gedanken und Ideen, damit wir den Microsoft Build of 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.