Quelle est la différence entre nécessite y nécessite une transposition les déclarations de module dans la déclaration de module ?
Par exemple :
module foo {
requires java.base;
requires transitive java.compiler;
}
Quelle est la différence entre nécessite y nécessite une transposition les déclarations de module dans la déclaration de module ?
Par exemple :
module foo {
requires java.base;
requires transitive java.compiler;
}
Si le module bar requires
module boire alors le système de modules...
C'est exactement la même chose si bar requires transitive drink
- boire doit être présent, peut être lu et accessible. En effet, pour bar y boire le site transitive
Le mot-clé ne change rien.
Les modules en fonction de bar sont ceux qui sont touchés par transitive
: Tout module qui lit bar peut également lire boire . En d'autres termes, la lisibilité de boire es implicite (c'est pourquoi on l'appelle lisibilité implicite ). Une conséquence est que client peut accéder boire Les types d'animaux.
Donc si bar requires transitive drink
y customer requires bar
alors client peut lire boire même si elle n'en dépend pas explicitement.
Mais pourquoi ? Imaginez que vous ayez un module dont l'API publique accepte ou renvoie le type d'un autre module. Disons que le module bar renvoie publiquement des instances de Drink
une interface de l boire module :
// in module _bar_
public class Bar {
// `Drink` comes from the module _drink_,
// which _bar_ requires
public Drink buyDrink() { /* ... */ }
}
Dans cet exemple, bar utilise une requires
pour boire . Maintenant, dites, client dépend de bar afin que tout son code puisse appeler Bar::buyDrink
. Mais que se passe-t-il quand c'est le cas ?
Le système de modules se plaint que client ne lit pas boire et ne peut donc pas accéder Drink
. Pour réparer cela, client devrait également dépendre de boire . Quelle corvée ! Quelle est l'utilité d'un bar que l'on ne peut pas utiliser immédiatement ?
C'est pour cette raison que la lisibilité implicite a été introduite : pour qu'un module qui utilise les types d'un autre module dans sa propre API publique soit immédiatement utilisable. sans obligeant l'appelant à rechercher et à exiger tous les modules concernés.
Donc si bar requires transitive drink
, client peut commencer à acheter des boissons sans avoir à require drink
- require bar
suffit. Comme il se doit.
La principale différence entre les deux est l'accès d'un module dépendant de l'un à l'autre.
Si un module exporte un paquet contenant un type dont la signature fait référence à un paquetage dans un second module, alors la déclaration du premier module doit inclure un
requires transitive
dépendance à l'égard de la seconde. Ce site s'assurera que les autres modules qui dépendent du module premier module seront automatiquement capables de lire le second module et, d'accéder à tous les types des paquets exportés de ce module.
Disons que pour votre cas d'utilisation :-.
module foo {
requires java.base;
requires transitive java.compiler;
}
~> Tout module qui dépend de la foo
lira automatiquement l'adresse java.compiler
module
~> D'autre part, pour accéder au module java.base
ils doivent préciser un requires
clause à nouveau.
module bar {
requires foo; // java.compiler is available to read
requires java.base; // still required
}
requires
décrit le processus de résolution sur la façon dont les modules sont dépendants les uns des autres.
Une directive 'requires' (indépendamment de 'transitive') exprime qu'un module dépend d'un autre module. un module dépend d'un autre module. L'effet de la Le modificateur "transitif" permet de faire en sorte que des modules supplémentaires dépendent également de l'autre module . Si le module M 'nécessite un N transitif', alors non seulement dépend de N, mais tout module qui dépend de M dépend également de N. N. Cela permet de remanier M de manière à ce qu'une partie ou la totalité de son contenu peut être déplacé vers un nouveau module N sans casser les modules qui ont une directive qui ont une directive 'requires M'.
En bref :
requires
- Le module M dépend d'un autre module N.
requires transitive
- module supplémentaire dépend implicitement de l'autre module. Par exemple, si le module M dépend de N, et que l'autre module P dépend de M, alors il dépend implicitement de N également.
Nicolai a expliqué en détail. Je ne donne ici qu'un exemple spécifique tiré du code JDK. Considérons le module jdk.scripting.nashorn. Le module-info de ce module est le suivant :
Il y a cette ligne :
requires transitive java.scripting;
Cela s'explique par le fait que jdk.scripting.nashorn dans l'API propre au module jdk.scripting.api.scripting accepte/renvoie les types de javax.script du paquet de l java.scripting module. Ainsi, jdk.scripting.nashorn indique au JMPS que tout module qui dépend de jdk.scripting.nashorn dépend aussi automatiquement du module java.scripting !
Maintenant, le même module jdk.scripting.nashorn utilise cette ligne :
requires jdk.dynalink;
pour un autre module jdk.dynalink . C'est parce que aucun des paquets exportés (l'"API") du module jdk.scripting.nashorn utilise des types du module jdk.dynalink. L'utilisation de jdk.dynalink par jdk.scripting.nashorn est purement un détail d'implémentation.
La spécification du langage Java pour Java 9 l'explique en termes très simples. Dans la section sur Dépendances des modules :
El
requires
spécifie le nom d'un module sur lequel le module courant a une dépendance....
El
requires
Le mot clé peut être suivi du modificateurtransitive
. Ainsi, tout module quirequires
le module courant a une dépendance implicitement déclarée sur le module spécifié par la baliserequires transitive
directive.
En d'autres termes :
requires
module Y,requires transitive
module Z,requires
module Z. Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.