Übersicht

Das Java Platform Module System (JPMS) wurde in Java 9 eingeführt. Es ermöglicht Ihnen, Ihren Code zu organisieren, indem verwandte Pakete gemeinsam in höherklassige Module gruppiert werden, und es bietet einen Mechanismus, um die Abhängigkeiten zwischen den Modulen zu definieren.


Die Modularisierung Ihrer Anwendung bietet mehrere Vorteile:

 - Eine Anwendung, die in Modulen organisiert ist, kann einfacher gelesen, verwaltet und besser skaliert werden.

 - Die Abhängigkeiten zwischen den Modulen werden durch Module Descriptors definiert, die sowohl zum Erstellungszeitpunkt überprüft werden, als auch wenn die Anwendung gestartet wird. Diese frühe Auflösung der Abhängigkeiten hilft bei der Verbesserung der Zuverlässigkeit der Laufzeit, wodurch ein seit langem bekanntes Java-Problem gelöst werden kann, bei dem "NoClassDefFoundError"-Ausnahmen eine häufige Ursache für Abstürze der Anwendung waren.

 - Die Pakete in einem Modul sind anderen Modulen nur zugänglich, wenn sie explizit exportiert werden. Dieses Prinzip wird Strong Capsulation (Datenkapselung) genannt und bietet standardmäßig einen sicheren Ort für den Code, in den Reflection nicht eindringen kann.

 - Schließlich ermöglicht Ihnen das Module System, individuelle Laufzeitbilder zu erstellen, die nur die Module enthalten, die von Ihrer Anwendung verwendet werden. Die verminderte Größe der Laufzeit-Umgebung verbessert merklich die Startzeit und den Speicherbedarf der Anwendung.


Seit Version 3.5.55 enthält der wrapper.jar einen Modul-Descriptor, der das 'org.tanukisoftware.wrapper'-Modul einführte. Dieses Named Module kann in ein individuelles Laufzeitbild, das mit jlink erstellt wird, integriert werden.

WARNING

Vor Version 3.5.55 war wrapper.jar nicht modularisiert. Bei der Referenzierung im Modulpfad wurde ein automatisches Modul namens 'wrapper' (abgeleitet vom Namen der JAR-Datei) erstellt. Das automatische Modul konnte in anderen Moduldeklarationen verwendet werden, jedoch nicht durch jlink, um Laufzeitbilder zu erstellen.

Wenn 'wrapper' in einigen Ihrer Modul-Descriptoren verwendet wird und Sie auf Wrapper-Version 3.5.55 oder neuer aktualisieren, vergessen Sie nicht, den Namen in 'org.tanukisoftware.wrapper' zu ändern.


Der Wrapper bietet mehrere Eigenschaften, die Ihnen helfen, zu konfigurieren, wie Module von Ihrer Anwendung verwendet werden:

NOTE

Diese Eigenschaften werden nur verwendet, wenn die Versionen Java 9 oder höher eingesetzt werden. In früheren Versionen werden sie ignoriert.

wrapper.java.module_path.<n>

Kompatibel :3.5.55, Erfordert Java 9+
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Diese Eigenschaften werden verwendet, um Orte aufzulisten, wo Module Ihrer Anwendung gefunden werden können. Die Liste kann Verzeichnisse oder Pfade zu jar-Dateien enthalten, sowie optional Wildcards im Bereich des Dateinamens.

Der Wrapper verwendet diese Liste, um die '--module-path'-Option der Java-Befehlszeile zu erstellen.

Wenn ein Wildcard-Zeichen innerhalb eines Modulpfad-Eintrags verwendet wird, werden alle entsprechenden Dateien dem Modulpfad hinzugefügt, wenn eine JVM-Instanz gestartet wird.

Gültige Wildcard-Zeichen sind

  • Ein '*'-Zeichen stimmt mit "0" (Null) oder mehr Zeichen überein.
  • Ein '?'-Zeichen stimmt mit genau einem Zeichen überein.

Beispiele für mögliche Werte für Modulpfad-Elemente:
wrapper.java.module_path.1=../lib/myapp-*.jar  # jar-Dateien, die mit einer Wildcard spezifiziert werden
wrapper.java.module_path.2=../lib/tools.jar    # Einzelne jar-Datei, die mit dem exakten Namen spezifiziert wird
wrapper.java.module_path.3=../lib/ext          # Ordner, in dem zusätzliche Module zu finden sind

NOTE

Die wrapper.jar sollte nicht in die Werte dieser Eigenschaftenliste eingeschlossen werden. Ist sie doch vorhanden, wird sie aus der Liste entfernt, wenn die Konfiguration geladen wird.

Der Wrapper verwendet die Eigenschaft wrapper.jarfile, um die wrapper.jar automatisch an der richtigen Stelle in der Befehlszeile einzufügen, abhängig davon, ob Module verwendet werden oder nicht.


Classpath:

Java gestattet nicht, dass zwei unterschiedliche jar-Dateien, die dasselbe Paket enthalten, gleichzeitig in der Modulpfadliste existieren. Dies ist nicht der Fall mit dem Classpath, bei dem historisch Paket-Überschneidungen immer zugelassen wurden. Das ist einer der Gründe, wieso der Classpath nützlich bleibt, zumindest, bis eine Anwendung vollständig in das Java-9-Modulsystem migriert werden kann.

Bitte beachten Sie die folgenden Einschränkungen: jar-Dateien, die im Classpath aufgelistet sind, und nicht an anderen Orten des Modulpfads gefunden werden können, werden von der JVM als Unnamed Module verwendet, wodurch sie naturgemäß für andere Module gesperrt sind. Soll ein Modul in einer requires Anweisung eines anderen Moduls referenziert werden, muss es an einem der Orte existieren, die von der Eigenschaft wrapper.java.module_path.<n> oder wrapper.java.upgrade_module_path.<n> angegeben werden.


Probleme?:

Wenn im Zusammenhang mit dem Modulpfad Probleme auftreten, sollte zunächst sichergestellt werden, dass der vollständige Modulpfad vom Wrapper generiert wird. Dafür wird entweder die Logausgabe der Fehlersuche mit der Eigenschaft wrapper.debug aktiviert oder die Anzeige des Java-Befehls mittels der Eigenschaft wrapper.java.command.loglevel aktiviert.

NOTE

Modulpfad, der Leerzeichen enthält:

Der Wrapper verarbeitet Modulpfadelemente, die Leerzeichen enthalten, korrekt. Dies wird später vom Wrapper gemacht, indem der zuletzt generierte Modulpfad in Anführungszeichen gesetzt wird. Einzelne Modulpfadelement-Eigenschaftswerte sollten niemals mit Anführungszeichen definiert werden, selbst wenn sie Leerzeichen enthalten.

wrapper.java.module_path.missing.loglevel

Kompatibel :3.5.55, Erfordert Java 9+
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Standardmäßig loggt der Wrapper Warnungen über jegliche fehlenden Modulpfad-Elemente auf der DEBUG-Logebene. Es ist ziemlich üblich, die erzeugten Lognachrichten einsehen zu wollen, ohne die komplette Debugausgabe zu aktivieren. Diese Eigenschaft ermöglicht es, die Logebene zu spezifizieren, auf der die Warnungen geloggt werden.

Gültige Logebenen sind:
  • FATAL :
    um auf der FATAL-Logebene zu loggen
  • ERROR :
    um auf der ERROR-Logebene zu loggen.
  • WARN :
    um auf der WARN-Logebene zu loggen.
  • STATUS :
    um auf der STATUS-Logebene zu loggen.
  • INFO :
    um auf der INFO-Logebene zu loggen.
  • DEBUG :
    um auf der DEBUG-Logebene zu loggen.
  • NONE :
    um niemals zu loggen.

Der Standardwert ist DEBUG.

Beispiel:
wrapper.java.module_path.missing.loglevel=DEBUG

Wenn in Ihrer Anwendung oft jars fehlen, deaktiviert die Einstellung dieses Wertes auf NONE Warnungen auf allen Logebenen.

Modulpfadelemente, die als Wildcards definiert sind, loggen ebenfalls eine Warnung, wenn die Wildcard nicht wenigstens mit einer Datei übereinstimmt. Dies kann passieren, wenn das Verzeichnis fehlt oder leer ist.

wrapper.java.upgrade_module_path.<n>

Kompatibel :3.5.55, Erfordert Java 9+
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Diese Eigenschaften definieren eine Liste, die ähnlich dem wrapper.java.module_path.<n> ist, aber das Überschreiben von erweiterungsfähigen Modulen zulässt, die im Laufzeitbild enthalten sind.

Ebenso wie wrapper.java.module_path.<n> kann die Liste Verzeichnisse enthalten oder Pfade zu jar-Dateien, die optional Wildcards im Dateinamen enthalten können. Weitere Informationen zur Syntax finden Sie im obenstehenden Abschnitt.

Der Wrapper wird mit dieser Liste die Option '--upgrade-module-path' der Java-Befehlszeile erstellen.

NOTE

Die wrapper.jar muss nicht in die Werte dieser Eigenschaftsliste eingeschlossen werden.

Der Wrapper verwendet die Eigenschaft wrapper.jarfile, um wrapper.jar automatisch an der korrekten Stelle in der Befehlszeile einzufügen, abhängig davon, ob Module verwendet werden oder nicht.

wrapper.java.upgrade_module_path.missing.loglevel

Kompatibel :3.5.55, Erfordert Java 9+
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Standardmäßig loggt der Wrapper Warnungen über jegliche fehlenden Modulpfad upgraden-Elemente auf der DEBUG-Logebene. Es ist ziemlich üblich, die erzeugten Lognachrichten einsehen zu wollen, ohne die komplette Debugausgabe zu aktivieren. Diese Eigenschaft ermöglicht es, die Logebene zu spezifizieren, auf der die Warnungen geloggt werden.

Gültige Logebenen sind:
  • FATAL :
    um auf der FATAL-Logebene zu loggen.
  • ERROR :
    um auf der ERROR-Logebene zu loggen.
  • WARN :
    um auf der WARN-Logebene zu loggen.
  • STATUS :
    um auf der STATUS-Logebene zu loggen.
  • INFO :
    um auf der INFO-Logebene zu loggen.
  • DEBUG :
    um auf der DEBUG-Logebene zu loggen.
  • NONE :
    um niemals zu loggen.

Der Standardwert ist DEBUG.

Beispiel:
wrapper.java.upgrade_module_path.missing.loglevel=DEBUG

Wenn in Ihrer Anwendung oft jars fehlen, deaktiviert die Einstellung dieses Wertes auf NONE Warnungen auf allen Logebenen.

Modulpfad upgraden-Elemente, die als Wildcards definiert sind, loggen ebenfalls eine Warnung, wenn die Wildcard nicht wenigstens mit einer Datei übereinstimmt. Dies kann passieren, wenn das Verzeichnis fehlt oder leer ist.

wrapper.java.module.<n>

Kompatibel :3.5.55, Erfordert Java 9+
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

Diese Eigenschaften werden verwendet, um die Namen der Root-Module aufzulisten, die von Ihrer Anwendung verwendet werden. Root-Module sind Module, die nicht in den Modulgraph gezogen werden können, wenn die Anwendung gestartet wurde, entweder weil sie von keinem anderen Modul benötigt werden oder weil es optionale Abhängigkeiten sind (d. h. sie sind in einem Modul-Descriptor als 'requires static' spezifiziert).

Der Wrapper verwendet diese Liste, um die Option '--add-modules' der Java-Befehlszeile zu erstellen.

Zusätzlich zu den Modulnamen kann die Liste folgende Tokens enthalten:

Detailliertere Informationen finden Sie unter OpenJDK specification.