2017-09-17 5 views
5

Ich versuche zu verstehen, wie JPMS funktioniert.Wie viele unbenannte Module werden in Java 9 erstellt?

Von here

Der Classpath vollständig ist noch nicht verschwunden. Alle JARs (modular oder nicht) und Klassen auf dem Klassenpfad werden im Unbenannten Modul enthalten sein. Ähnlich wie automatische Module exportiert es alle Pakete und liest alle anderen Module . Aber es hat offensichtlich keinen Namen. Aus diesem Grund Grund, kann es von benannten Anwendungsmodulen nicht benötigt und gelesen werden. Das unbenannte Modul kann wiederum auf alle anderen Module zugreifen.

Bitte beachten Sie ...on the classpath will be contained in the Unnamed Module. Das Modul ist einzigartig.

Von here

Für die Kompatibilität, alle Code auf dem Classpath als spezielle unbenannte Modul verpackt up, ohne versteckte Pakete und vollen Zugriff auf das ganze JDK.

Wieder unnamed module. Das Modul ist einzigartig.

Verstehe ich richtig, dass es in JPMS immer nur ein unbenanntes Modul gibt? Bedeutet dies, dass Anwendungen, die vor Java9 entwickelt und nicht für Java9 aktualisiert wurden, als ein unbenanntes Modul geladen werden?

Antwort

5

Verstehe ich richtig, dass es immer nur ein ungenannter Modul in JPMS ist?

Kurz

Im Allgemeinen nicht. Aber lassen Sie es uns so sagen: Wenn Sie einige oder sogar alle JARs im Klassenpfad platzieren und Ihre Anwendung keine Klassenladeprogramme erstellt, um zusätzlichen Inhalt zu laden, dann gibt es nur ein unbenanntes Modul, um das Sie sich kümmern müssen.

Im Detail

jedes ClassLoader hat its own unnamed module, die es verwendet Klassen darzustellen, die sie aus dem Klassenpfad geladen. Dies ist notwendig, da das Modulsystem alles in einem Modul benötigt.

Da nullpointer's answer detailliert erläutert wird, verwendet eine Anwendung standardmäßig drei separate Klassenladeprogramme. Es ist möglich, dass es seine eigenen Klassenladeprogramme hochlädt, um beispielsweise Plugins zu laden. Wenn dies jedoch nicht geschieht, wird der gesamte Anwendungscode im Loader für die System-/Anwendungsklasse und damit im unbenannten Modul enden. Deshalb gibt es normalerweise nur einen, um den Sie sich kümmern müssen.

Bedeutet dies, dass Anwendungen, die vor Java9 entwickelt und nicht für Java9 aktualisiert wurden, als ein unbenanntes Modul geladen werden?

Das hat nichts mit, ob Code zu tun (Anwendung, Frameworks, Bibliotheken) zielt auf Java 9 - es hängt nur von welchem ​​Weg Sie eine JAR-Platz, auf dem Klassenpfad oder die module path.

Wenn es sich um den Klassenpfad handelt, endet es zusammen mit dem Inhalt anderer Klassenpfade im unbenannten Modul. Dies gilt für einfache JARs ohne Moduldeskriptor, aber auch für modulare JARs, die eins enthalten.

Wenn es auf dem Modulpfad ist, erhält es ein eigenes Modul. Wenn es sich um ein modulares JAR handelt, erhält es ein explizites Modul als those described throughout the State of the Module System - einfache JARs werden in automatic modules umgewandelt (man beachte den Plural: ein automatisches Modul pro JAR).

4

Verstehe ich richtig, dass es in JPMS immer nur ein unbenanntes Modul gibt?

Ja, es gibt ein unbenanntes Modul. Das unbenannte Modul ist dem bestehenden Konzept der unnamed package sehr ähnlich.

In Implementierungen der Java SE-Plattform, die ein hierarchisches Dateisystem zum Speichern von Paketen verwenden, besteht eine typische Strategie darin, jedem Verzeichnis ein unbenanntes Paket zuzuordnen; Es ist jeweils nur ein unbenanntes Paket beobachtbar, nämlich jenes, das dem "aktuellen Arbeitsverzeichnis" zugeordnet ist. Die genaue Bedeutung von "aktuelles Arbeitsverzeichnis" hängt vom Host-System ab.


Bedeutet es, dass Anwendungen, die vor Java9 und nicht aktualisiert Java9 entwickelt wurden, werden als eine unbenannte Modul geladen werden?

Ja, für diese Gläser auf dem Klassenpfad platziert würde als ein einziges unbenanntes Modul behandelt werden. Die bottom up migration mit dem Konzept der ungenannten Module veranschaulicht dies mit einem ähnlichen Beispiel wie:

Angenommen, zum Beispiel, dass die Anwendung über ursprünglich für Java SE 8, als eine Reihe von ähnlich benannten JAR-Dateien erstellt worden gezeigt hatte platziert auf der Klassenpfad. Wenn wir es unverändert auf Java SE 9 ausführen, werden die Typen in den JAR-Dateien im unbenannten Modul definiert.


Die eigentliche Frage, die hier entstehen können, ist Welche Klassenlader die unbenannte Modul zugeordnet ist? The State of Module System about unnamed module gibt stattdessen eine Klarstellung darüber.

Jede Klasse Loader, es stellt sich heraus, hat seine eigene einzigartige unbenannte Modul, , die durch die neuen ClassLoader::getUnnamedModule Methode zurückgegeben wird. Wenn ein Klassenlader eine Art lädt, die nicht dann in einem benannten Modul definiert ist diese Art in diesem Laders unbenannte Modul betrachtet wird, dh die getModule Methode des Class Objekttyp wird zurückkehren sein unbenanntes Modul loader. Das Modul umgangssprachlich als „das unbenannte Modul“ bezeichnet ist, dann einfach das unbenannte Modul der Anwendung Class Loader, die Typen aus dem Classpath geladen wird, wenn sie in Pakete sind nicht durch jedes bekannte Modul definiert.

Die ClassLoader revidiert in Java-9 besagt, dass:

  • Bootstrap class loader:

    Die Java-Laufzeit die folgenden integrierten Klasse Lader hat: Der integrierte Klassenlader der virtuellen Maschine ...

  • Platform class loader: ... Um Modernisierung/übergeordnete Module zu ermöglichen die Plattform Class Loader definiert, und wo ein Upgrade Module lesen Module Klasse definiert Lader andere als die Plattform Class Loader und seine Vorfahren, dann die Platform Class Loader muss möglicherweise an andere Klassenlader delegieren, z. B. der Anwendung Klassenlader. Mit anderen Worten, Klassen in benannte Module, die für andere Klassenladeprogramme als die Plattformklasse definiert sind loader und ihre Vorfahren können für den Plattformklassenlader sichtbar sein.

  • System class loader: Es ist auch als Anwendungsklasse Lader bekannt und unterscheidet sich von der Plattform Klassenlader. Das System Class Loader wird normalerweise verwendet, um Klassen für die Anwendung Klassenpfad, Modulpfad und JDK-spezifische Tools zu definieren. Die Plattformklasse loader ist ein Elternteil oder ein Vorgänger des Systemklassenladeprogramms, das alle Plattformklassen enthält.

Verwandte Themen