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

我有以下程序:

模块信息.java

module a {
}

主要.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将参数传递给javac,如果我的项目需要内部API,这使得IDEA中的开发变得不可能。--release

我使用的是 JDK 9+178。


答案 1

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

转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 并选中“项目字节码版本”设置。在使用JDK 11时,我遇到了类似的错误(“不允许使用--release从系统模块java.datatransfer导出包”),而此值仍设置为版本9。将其设置为11为我解决了问题。

Screenshot


答案 2

此 bug 票证中可以看出,它不能与 、 和 结合使用。--release--add-exports--add-reads--patch-module

从链接:

这里的总体建议是让 --release 9 在 JDK 9 和(预期的)JDK 10 之间一致地工作,即使代价是命令的可能不同行为,例如:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java

也:

考虑到 --release - 的意图,这应该是可以接受的,允许使用给定JDK版本的受支持API编译代码。

具体而言,该提案是:

[编辑]

--添加导出、-添加读取和 --patch-模块与 --release(任何版本)结合使用的系统模块

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

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

我不能评论理由,但从上面的引用来看,它与允许JDK 9与JDK 10一致地工作有关。


推荐