web-dev-qa-db-fra.com

Impossible d'exporter un package à partir du module Java.base

Utilisation d'IDEA-EAP pour des expériences de développement JDK9.

Je reçois l'erreur suivante -

Error:(3, 20) Java: package jdk.internal.misc is not visible  
(package jdk.internal.misc is declared in module Java.base, which does
not export it to module com.jigsaw.npe)

La définition de classe est comme -

package experiment;
import jdk.internal.misc.Unsafe;

public class CompareAndSwap {

    static Unsafe UNSAFE = Unsafe.getUnsafe();
    ...
}

J'ai essayé d'inclure un module-info.Java également dans le module créé en utilisant le IDE avec les instructions suivantes -

module com.jigsaw.npe {
    requires Java.base;
}

La structure du répertoire ressemble maintenant à celle illustrée -

Directory Structure

Le IDE reflète cependant le module-info.Java comme inutilisé et c'est probablement la raison pour laquelle je ne suis pas en mesure de définir le module com.jigsaw.npe comme essayé ci-dessus.

Vous cherchez de l'aide sur la façon de placer correctement le module-info.Java et/ou autre chose que ce que j'ai manqué.

13
Naman

réponse de Nicolai est correct en ce qui concerne les techniques nécessaires pour exporter un paquet non exporté depuis le Java.base module ou de tout autre module.

Mais si l'objectif est d'utiliser Unsafe, la façon de le faire est d'utiliser Sun.misc.Unsafe qui est exporté par le jdk.unsupported module. Si vous compilez votre code pour le module sans nom, vous n'avez rien à faire de spécial concernant les modules pour y accéder. Si vous compilez du code dans un module, vous devez ajouter

requires jdk.unsupported;

à ton module-info.Java fichier.

Pour utiliser Unsafe, vous devez appliquer la technique réfléchissante setAccessible pour accéder au champ, ce qui est le même que pour les versions précédentes du JDK:

import Sun.misc.Unsafe;

...

Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);

Même si Unsafe est dans le jdk.unsupported module, cette technique est prise en charge dans JDK 9, conformément à JEP 26 .

16
Stuart Marks

Le module Java.base ne fait pas export le package jdk.internal.misc., donc le type jdk.internal.misc.Unsafe n'est pas accessible - en conséquence, la compilation échoue.

Vous pouvez lui faire exporter le package en ajoutant l'option de ligne de commande suivante:

# if you want to access it from com.jigsaw.npe only:
--add-exports Java.base/jdk.internal.misc=com.jigsaw.npe
# if you want to access from all code:
--add-exports Java.base/jdk.internal.misc=ALL-UNNAMED

Vous devrez le faire lors de la compilation (javac) et lors de l'exécution (Java) du code.

13
Nicolai