En raison du nouveau système de modules, Java 9 ne permet pas à une application par défaut de voir toutes les classes du JDK, contrairement à toutes les versions précédentes de Java. Si nous essayons d’accéder à un module réservé, nous obtenons une erreur comme celle-ci :module <module-name> does not "opens <package-name>" to unnamed module
.
Tout le monde sait que nous pouvons résoudre cette exception en utilisant les paramètres JVM --add-exports
ou add-opens
, mais que se passe-t-il si nous avons plus d’environnements et que nous ne voulons pas avoir à modifier les arguments JVM dans ces environnements ?
Dans cette situation, Burningwave Core vient à notre secours en nous fournissant la méthode org.burningwave.core.assembler.StaticComponentContainer.Modules.exportAllToAll()
cela nous permet d’exporter tous les modules dans tous les modules, résolvant ainsi notre problème. Cette méthode est appelée par défaut à l’initialisation de la classe org.burningwave.core.assembler.StaticComponentContainer.
Ce comportement peut être modifié en incluant dans le dossier de base de votre chemin de classe un fichier nommé burningwave.static.properties
qui contient une propriété nommée modules.export-all-to-all
dont la valeur est false, nous laissant ainsi la possibilité d’appeler cette méthode manuellement.
Noter: Il n’est pas nécessaire de mettre dans le burningwave.static.properties
archiver toutes les propriétés présentes dans le lien relatif fourni précédemment) :
Modules.exportAllToAll();
//Now that we have called exportAllToAll () we can use any class of any module
Class<?> bootClassLoaderClass = Class.forName("jdk.internal.loader.ClassLoaders$BootClassLoader");
Constructor<? extends ClassLoader> constructor =
ClassLoader.getPlatformClassLoader().getClass().getDeclaredConstructor(bootClassLoaderClass);
constructor.setAccessible(true);
Class<?> classLoadersClass = Class.forName("jdk.internal.loader.ClassLoaders");
Method bootClassLoaderRetriever = classLoadersClass.getDeclaredMethod("bootLoader");
bootClassLoaderRetriever.setAccessible(true);
ClassLoader newBuiltinclassLoader = constructor.newInstance(bootClassLoaderRetriever.invoke(classLoadersClass));
System.out.println(newBuiltinclassLoader + " instantiated");
Le composant Modules expose également d’autres méthodes pour une plus grande granularité :
export(String moduleNameFrom, String moduleNameTo)
exportPackage(String moduleNameFrom, String moduleNameTo, String... packageNames)
exportPackageToAll(String name, String... packageNames)
exportPackageToAllUnnamed(String name, String... packageNames)
exportToAll(String name)
exportToAllUnnamed(String name)
Par conséquent, en référence à l’exemple ci-dessus, si nous voulons limiter l’export au package de notre intérêt, nous devons remplacer l’appel exportAllToAll()
avec exportPackageToAllUnnamed("java.base", "java.net")
.
À partir de là, vous pouvez télécharger/cloner le didacticiel partagé sur GitHub.