Java-Plattform-Modulsystem - Java Platform Module System

Das Java Platform Module System spezifiziert ein Verteilungsformat für Sammlungen von Java- Code und zugehörigen Ressourcen. Es gibt auch ein Repository zum Speichern dieser Sammlungen oder Module an und gibt an, wie sie entdeckt, geladen und auf Integrität überprüft werden können. Es enthält Funktionen wie Namespaces mit dem Ziel, einige der Mängel des bestehenden JAR- Formats zu beheben , insbesondere JAR Hell , die zu Problemen wie Klassenpfad- und Klassenladeproblemen führen können.

Das Java Module System wurde ursprünglich unter dem Java Community Process als JSR 277 entwickelt und sollte mit Java 7 veröffentlicht werden.

JSR 277 wurde später auf Eis gelegt und Project Jigsaw wurde erstellt, um das JDK zu modularisieren. Diese JSR wurde durch JSR 376 (Java Platform Module System) ersetzt.

Project Jigsaw war ursprünglich für Java 7 (2011) gedacht , wurde aber im Rahmen von Plan B auf Java 8 (2014) und 2017 erneut auf ein Java 9- Release verschoben . Java 9 einschließlich des Java Module System wurde am 21. September veröffentlicht. 2017.

Die Architektur

Das in Java 9 implementierte Java Module System umfasst die folgenden JEPs und JSR (Java Specification Request) :

  • JEP 200: Das modulare JDK: Definieren Sie eine modulare Struktur für das JDK
  • JEP 201: Modularer Quellcode: Reorganisieren Sie den JDK-Quellcode in Module, verbessern Sie das Build-System, um Module zu kompilieren, und setzen Sie Modulgrenzen zur Build-Zeit durch
  • JEP 220: Modulare Laufzeit-Images: Restrukturieren Sie die JDK- und JRE-Laufzeit-Images, um Module aufzunehmen und die Leistung, Sicherheit und Wartbarkeit zu verbessern
  • JEP 261: Modulsystem: Implementieren des Java Platform Module Systems
  • JEP 282: The Java Linker: Erstellen Sie ein Tool, das eine Reihe von Modulen und deren Abhängigkeiten zu einem benutzerdefinierten Laufzeit-Image zusammenstellen und optimieren kann
  • JSR 376: Java-Plattformmodulsystem

Darüber hinaus wurden mehrere andere JDK 9-Funktionen hinzugefügt, um den Übergang zum Modulsystem zu erleichtern:

  • JEP 238: Multi-Release-JAR-Dateien: Erweitern Sie das JAR-Dateiformat, um die Koexistenz mehrerer Java-release-spezifischer Versionen von Klassendateien in einem einzigen Archiv zu ermöglichen.
  • JEP 253: JavaFX- UI-Steuerelemente und CSS-APIs für die Modularisierung vorbereiten: Definieren Sie öffentliche APIs für die JavaFX-Funktionalitäten, die derzeit nur über interne APIs verfügbar sind und aufgrund der Modularisierung unzugänglich werden würden.
  • JEP 260: Kapseln Sie die meisten internen APIs: Machen Sie die meisten internen APIs des JDK standardmäßig unzugänglich, aber lassen Sie einige kritische, weit verbreitete interne APIs zugänglich, bis unterstützte Ersetzungen für alle oder die meisten ihrer Funktionen existieren.
  • JEP 275: Modulare Java-Anwendungspaketierung: Der Java-Packer wird für JDK 9 weiterentwickelt, wodurch er auf Module aufmerksam wird, so dass beispielsweise ein Modul und alle Module, von denen es abhängt, gepackt werden können.

Eigenschaften von Modulen

Module sind eine neue Möglichkeit, Code zu gruppieren. Im Gegensatz zu Jar-Dateien deklarieren Module explizit, von welchen Modulen sie abhängig sind und welche Pakete sie exportieren. Explizite Abhängigkeitsdeklarationen verbessern die Integrität des Codes, indem sie es einfacher machen, über große Anwendungen und die Abhängigkeiten zwischen Softwarekomponenten nachzudenken.

Die folgende Moduldeklaration deklariert beispielsweise, dass das Modul com.foo.bar von einem anderen com.foo.baz- Modul abhängt und exportiert die folgenden Pakete: com.foo.bar.alpha und com.foo.bar.beta :

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.alpha;
    exports com.foo.bar.beta;
}

Die öffentlichen Mitglieder der Pakete com.foo.bar.alpha und com.foo.bar.beta werden über abhängige Module zugänglich sein. Private Mitglieder sind selbst durch ein Mittel wie Reflection nicht zugänglich , obwohl der 'illegale Zugriff' de facto von einer Befehlszeileneinstellung abhängt.

Im Gegensatz zum Jar-Dateiformat beschreibt das Modul diese Abhängigkeiten in einer Moduldeklaration, die in einer Datei namens module-info.java an der Wurzel der Quelldateihierarchie des Moduls platziert wird. Das JDK wird in der Lage sein, Abhängigkeiten und Interaktionen zwischen Modulen sowohl zur Kompilierzeit als auch zur Laufzeit zu überprüfen. Das JDK selbst wurde in Java 9 modularisiert .

Links mit OSGi

Das Java Module System beabsichtigt nicht, alle Funktionalitäten zu unterstützen, die die OSGi- Plattform derzeit unterstützt (zB das Life-Cycle-Modell und die Services Registry). Das Java Module System wird jedoch Funktionen unterstützen, die von OSGi nicht unterstützt werden, wie beispielsweise Modularität zur Kompilierzeit und integrierte Unterstützung für native Bibliotheken. 2016 wurden einige Artikel veröffentlicht, die sich mit der Interoperabilität von Java Module System und OSGi befassen. Diese sind auf InfoQ und auch im OSGi Alliance Blog zu finden.

Siehe auch

Verweise

Externe Links