2017-10-03 4 views
7

Was ist der Unterschied zwischen erfordert und erfordert statische Modul Aussagen in Moduldeklaration?Was ist der Unterschied zwischen erfordert und erfordert statisch in Moduldeklaration

Zum Beispiel:

module bar { 
    requires java.compiler; 
    requires static java.base; 
} 
+3

Mögliches Duplikat von [Unterstützt das Java 9 Module System optionale Abhängigkeiten?] (Https://stackoverflow.com/questions/39900460/does-the-java-9-module-system-supportoptionaldependencies) – ZhekaKozlov

+1

@ ZhekaKozlov Obwohl ich die doppelte Stimme unterstütze. Aber nicht sehr sicher, ob die verlinkte Post die * Differenz * zwischen den beiden angibt. Wie auch immer, ich glaube auch, dass das Hauptmotiv hinter dieser Frage darin bestehen könnte, über den 'statischen' Modifikator auf der 'Requires'-Direktive selbst zu wissen. – nullpointer

+1

Ich halte das nicht für ein Duplikat. Während beide Fragen sich mit dem gleichen Thema befassen, haben sie sehr unterschiedliche Blickwinkel. Diese Frage wird von Leuten gefunden, die nach der Syntax suchen, die andere von Leuten, die die Anforderung haben, eine Abhängigkeit optional zu machen. – Nicolai

Antwort

7

Eine requires Klausel drückt aus, dass das erforderliche Modul zum Kompilieren und zur Laufzeit benötigt wird. Wenn das Modulsystem während module resolution (der Phase, in der Moduldeskriptoren verarbeitet werden und Abhängigkeiten aufgelöst werden) eine solche Klausel trifft, durchsucht es folglich das Universum beobachtbarer Module (die Module im JDK und auf dem Modulpfad) und gibt einen Fehler if aus Es findet das Modul nicht.

Eine requires static Klausel drückt a dependency that is optional at run time aus. Das bedeutet, dass sich das Modulsystem zur Kompilierzeit genau wie oben beschrieben verhält.

Zur Laufzeit ignoriert es dagegen meistens requires static Klauseln. Wenn es eins trifft, löst es es nicht auf. Das heißt, wenn ein beobachtbares Modul nur mit requires static referenziert wird, gelangt es nicht in das Moduldiagramm! Dies kann zunächst etwas überraschend sein. Wenn das Modul andererseits auf andere Weise in den Graphen gelangt (benötigt von einem anderen Modul, added manually with --add-modules, eingezeichnet von service binding), können alle Module, die eine optionale Abhängigkeit davon haben, read.

3

Der Hauptunterschied zwischen den beiden ist, dass im Falle von

requires static foo.module; 

Die Abhängigkeit in der statischen Phase zwingend vorgeschrieben ist, während der Kompilierung, aber ist optional in der dynamische Phase, während der Ausführung andererseits

requires bar.module; 

Wird hinzugefügt, um zu deklarieren, dass das Modul namentlich von einigen anderen Modulen abhängt, , sowohl zur Kompilierzeit als auch zur Laufzeit.

Verwandte Themen