--release 不允许从系统模块导出包

Exporting a package from system module is not allowed with --release

我有以下程序:

模块-info.java

module a {
}

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println(sun.nio.ByteBuffered.class);
    }
}

此程序使用 --add-exports 选项成功编译:

> javac --add-exports java.base/sun.nio=a module-info.java Main.java

但是,当我添加 --release 参数时,它失败了:

> javac --add-exports java.base/sun.nio=a --release 9 module-info.java Main.java
error: exporting a package from system module java.base is not allowed with --release
1 error

基本上,这两个命令是等价的。那么为什么后一种被禁止呢?

此外,由于 IDEA 将 --release 参数传递给 javac,如果我的项目需要内部 API.

,这将导致无法在 IDEA 中进行开发

我正在使用 JDK 9+178。

this bug ticket看来,--release不能与--add-exports--add-reads--patch-module结合使用。

来自link:

The overall proposal here is to get make --release 9 work consistently between JDK 9 and the (anticipated) JDK 10, even at the cost of a possible different behavior of commands like:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java

还有:

Which should be acceptable, given the intents of --release - allow to compile code using supported APIs for the given JDK release.

In particular the proposal is to:

[edit]

-prevents use of --add-exports, -add-reads and --patch-module for system modules in combination with --release (any version)

Here 是包含以下内容的文件差异:

exporting a package from system module {0} is not allowed with --release

我无法对理由发表评论,但从上面的引述来看,它与允许 JDK 9 与 JDK 10 一致地工作有关。

如果您使用的是 IntelliJ idea,请尝试检查您的 Java 编译器设置:

转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 并检查设置 "Project bytecode version"。我在使用 JDK 11 时遇到了类似的错误 ("exporting a package from system module java.datatransfer is not allowed with --release"),而此值仍设置为版本 9。将其设置为 11 解决了我的问题。

改用-target & -source

-target 11 -source 11

转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 和 select 你的 JDK 版本。 (确保高于JDK11)

如果您使用的是 InetlliJ Idea,请执行以下设置: 转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 和 select 你的 JDK 版本,有时这是空的,所以插入java 版本如 [if you use 11] 并保存, 然后编译程序和运行.

如果你用的是IntelliJ,还有更好的解决办法。 只需取消选中 Java 编译器设置中的“使用‘--release’选项”复选框