无法从 java.base 模块导出包
Unable to export a package from java.base module
使用 IDEA-EAP 进行 JDK9 开发实验。
我收到以下错误 -
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)
class 定义为 -
package experiment;
import jdk.internal.misc.Unsafe;
public class CompareAndSwap {
static Unsafe UNSAFE = Unsafe.getUnsafe();
...
}
我尝试在使用 IDE 创建的模块中包含一个 module-info.java
文件,并使用以下语句 -
module com.jigsaw.npe {
requires java.base;
}
目录结构现在看起来如图所示 -
虽然 IDE 将 module-info.java
反映为未使用,但可能这就是我无法像上面那样定义 module com.jigsaw.npe
的原因。
正在寻求有关如何正确放置模块的帮助-info.java and/or 除了我错过的任何东西。
模块 java.base 没有 export the package jdk.internal.misc.
, so the type jdk.internal.misc.Unsafe
is not accessible - 因此编译失败。
您可以通过添加以下命令行选项使其导出包:
# 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
编译 (javac
) 和 运行 (java
) 代码时,您必须这样做。
关于从 java.base
模块或任何其他模块导出未导出包所需的技术是正确的。
但是如果目标是使用Unsafe
,那么方法就是使用jdk.unsupported
模块导出的sun.misc.Unsafe
。如果您正在为未命名模块编译代码,则无需对模块做任何特殊操作即可访问它。如果你在模块中编译代码,你需要添加
requires jdk.unsupported;
到您的 module-info.java
文件。
要使用 Unsafe
,您必须使用反射 setAccessible
技术来访问该字段,这与您在之前的 JDK 版本中必须执行的操作相同:
import sun.misc.Unsafe;
...
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);
尽管 Unsafe
在 jdk.unsupported
模块中,但根据 JEP 260.
,此技术在 JDK 9 中受支持
使用 IDEA-EAP 进行 JDK9 开发实验。
我收到以下错误 -
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)
class 定义为 -
package experiment;
import jdk.internal.misc.Unsafe;
public class CompareAndSwap {
static Unsafe UNSAFE = Unsafe.getUnsafe();
...
}
我尝试在使用 IDE 创建的模块中包含一个 module-info.java
文件,并使用以下语句 -
module com.jigsaw.npe {
requires java.base;
}
目录结构现在看起来如图所示 -
虽然 IDE 将 module-info.java
反映为未使用,但可能这就是我无法像上面那样定义 module com.jigsaw.npe
的原因。
正在寻求有关如何正确放置模块的帮助-info.java and/or 除了我错过的任何东西。
模块 java.base 没有 export the package jdk.internal.misc.
, so the type jdk.internal.misc.Unsafe
is not accessible - 因此编译失败。
您可以通过添加以下命令行选项使其导出包:
# 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
编译 (javac
) 和 运行 (java
) 代码时,您必须这样做。
java.base
模块或任何其他模块导出未导出包所需的技术是正确的。
但是如果目标是使用Unsafe
,那么方法就是使用jdk.unsupported
模块导出的sun.misc.Unsafe
。如果您正在为未命名模块编译代码,则无需对模块做任何特殊操作即可访问它。如果你在模块中编译代码,你需要添加
requires jdk.unsupported;
到您的 module-info.java
文件。
要使用 Unsafe
,您必须使用反射 setAccessible
技术来访问该字段,这与您在之前的 JDK 版本中必须执行的操作相同:
import sun.misc.Unsafe;
...
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);
尽管 Unsafe
在 jdk.unsupported
模块中,但根据 JEP 260.