2017-03-01 3 views
8

Verwendung von IDEA-EAP für JDK9-Entwicklungsexperimente.Das Paket konnte nicht aus dem Modul java.base exportiert werden.

Ich erhalte die folgenden Fehler -

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) 

Die Klassendefinition ist als -

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

public class CompareAndSwap { 

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

Ich habe versucht, auch innerhalb des Moduls einer module-info.java Datei einschließlich erstellt mit die IDE mit den folgenden Anweisungen -

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

Verzeichnisstruktur sieht nun, wie im Bild dargestellt -

Directory Structure

Die IDE spiegelt allerdings die module-info.java als nicht verwendet und wahrscheinlich ist dies der Grund, dass ich nicht in der Lage bin die module com.jigsaw.npe als versuchte oben zu definieren.

Auf der Suche nach etwas Hilfe auf, wie man das Modul-info.java und/oder irgendetwas anderes als das, das ich verpasst habe, richtig setzt.

+0

@StefanZobel was genau macht der Befehl und gibt es irgendeine Voraussetzung dafür? – nullpointer

+3

Ihr Setup ist völlig in Ordnung und das hat nichts mit IntelliJ zu tun. Ich empfehle, die Frage (und die Tags) zu bearbeiten, um diesen Teil zu entfernen. – Nicolai

Antwort

11

Nicolai's answer ist korrekt in Bezug auf die Techniken, die notwendig sind, um ein ansonsten nicht exportiertes Paket aus dem Modul java.base oder einem anderen Modul zu exportieren.

Aber wenn das Ziel ist, Unsafe zu verwenden, ist die Verwendung sun.misc.Unsafe, die von dem jdk.unsupported-Modul exportiert wird. Wenn Sie Ihren Code für das unbenannte Modul kompilieren, müssen Sie nichts Besonderes in Bezug auf Module tun, um Zugriff darauf zu erhalten. Wenn Sie Code in einem Modul sind kompilieren, müssen Sie

requires jdk.unsupported; 

auf Ihre module-info.java Datei hinzuzufügen.

verwenden Unsafe Sie die reflektierende setAccessible Technik zu tun haben Zugriff auf das Feld zu bekommen, die die gleiche ist wie in früheren JDK Versionen zu tun hatte:

import sun.misc.Unsafe; 

... 

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

Obwohl Unsafe in der jdk.unsupported ist Modul wird diese Technik in JDK 9 gemäß JEP 260 unterstützt.

8

Das Modul java.base nicht export das Paket jdk.internal.misc., so jdk.internal.misc.Unsafe der Typ ist nicht accessible - als Folge Kompilation ausfällt.

Sie können das Paket machen exportieren, indem Sie die folgende Befehlszeilenoption hinzugefügt:

# 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 

Sie das tun müssen, beim Kompilieren (javac) und wenn (java) den Code ausgeführt wird.

+0

'--add-exports' existiert nicht mehr – madduci

+1

Ja, tut es. Rufen Sie 'java -X' auf und schauen Sie:' --add-exports / = (, ) * ' – Nicolai

+0

ja als Option in der Kommandozeile, es existiert, aber wenn Sie setzen Java-Optionen mit --add-exports, es funktioniert nicht und beschwert sich, dass es ein unbekanntes Kommandozeilenargument ist – madduci

Verwandte Themen