问题
Using IDEA-EAP for JDK9 development experiments.
I am getting the following error -
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)
The class definition is as -
package experiment;
import jdk.internal.misc.Unsafe;
public class CompareAndSwap {
static Unsafe UNSAFE = Unsafe.getUnsafe();
...
}
I've tried including a module-info.java
file as well inside the module created using the IDE with the following statements -
module com.jigsaw.npe {
requires java.base;
}
Directory structure now looks as depicted in the picture -
The IDE though reflects the module-info.java
as unused and probably this is the reason that I am not able to define the module com.jigsaw.npe
as tried above.
Looking for some help on to how to correctly place the module-info.java and/or anything other than that which I've missed.
回答1:
Nicolai's answer is correct regarding the techniques necessary to export an otherwise unexported package from the java.base
module or from any other module.
But if the goal is to use Unsafe
, the way to do so is to use sun.misc.Unsafe
which is exported by the jdk.unsupported
module. If you're compiling your code for the unnamed module, you needn't do anything special regarding modules to get access to it. If you're compiling code in a module, you need to add
requires jdk.unsupported;
to your module-info.java
file.
To use Unsafe
you have to do the reflective setAccessible
technique to get access to the field, which is the same as you had to do in previous JDK releases:
import sun.misc.Unsafe;
...
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);
Even though Unsafe
is in the jdk.unsupported
module, this technique is supported in JDK 9, in accordance with JEP 260.
回答2:
The module java.base does not export the package jdk.internal.misc.
, so the type jdk.internal.misc.Unsafe
is not accessible - as a consequence compilation fails.
You can make it export the package by adding the following command line option:
# 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
You will have to do that when compiling (javac
) and when running (java
) the code.
来源:https://stackoverflow.com/questions/42538750/unable-to-export-a-package-from-java-base-module