如何在 java11 中使用 jdk.internal.misc.Signal

how to use jdk.internal.misc.Signal in java11

我有一个使用 jdk.internal.misc.Signal 的 class。 在 module-info.java 中有 requires jdk.unsupported

如果我尝试编译它,我会得到:

[ERROR] MyClass.java:[28,20] package jdk.internal.misc is not visible
[ERROR]   (package jdk.internal.misc is declared in module java.base, which does not export it to module MyModule)

然后如果我添加 <arg>--add-exports</arg><arg>java.base/jdk.internal.misc=MyModule</arg> 到 maven-compiler-plugin:3.8.1 我得到:

[ERROR] exporting a package from system module java.base is not allowed with --release

然后如果我删除 <release>11</release> 我得到:

Fatal error compiling: warning: source release 11 requires target release 11

我觉得我遗漏了一些重要的东西,或者这可能只是一个错误? 我正在使用 maven 3.6.3 和 openjdk 11.0.2.

通过将我的 pom.xml 中的 <release>11</release> 更改为 <target>11</target> 来修复:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>

jdk.internal.misc.Signaljava.base 模块中。如果您查看它的 module-info.java 文件,您会注意到:

    exports jdk.internal.misc to
        (...)
        jdk.unsupported;

但是 jdk.unsupported 包含 sun.misc.Signal,这是用于处理信号的原始 Java 9 class。

通常在 .internal. 包中使用 classes 是一种不好的做法,因为它们不是 public API.

的一部分

相反,我建议将 sun.misc.Signalrequires jdk.unsupported 模块子句一起使用,直到有一个 @Deprecated 注释包含应该使用 API 的信息。

顺便说一句。这是 JPMS 如何帮助从 un/intended 用法中隐藏库(在本例中 JDK)的内部实现细节的一个很好的例子。