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

Zhe*_*lov 10 java javac java-platform-module-system java-9

我有以下程序:

module-info.java

module a {
}
Run Code Online (Sandbox Code Playgroud)

Main.java

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

该程序成功编译--add-exports选项:

> javac --add-exports java.base/sun.nio=a module-info.java Main.java
Run Code Online (Sandbox Code Playgroud)

但是,当我添加--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
Run Code Online (Sandbox Code Playgroud)

基本上,这两个命令是等效的.那么为什么后者被禁止呢?

此外,由于IDEA将--release参数传递给javac,如果我的项目需要内部API,这使得IDEA的开发变得不可能.

我正在使用JDK 9 + 178.

Vic*_*azi 13

如果您使用 IntelliJ,有更好的解决方案。只需取消选中 Java 编译器设置中的“使用‘--release’选项”复选框即可 在此输入图像描述


小智 7

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

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

截屏

  • 我清除了**使用'--release'选项**,IDEA不会将这个选项添加到编译器中,编译成功。 (3认同)

Mic*_*ter 6

这个错误票中看来,--release不能与--add-exports--add-reads、 和结合使用--patch-module

从链接:

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

还:

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

该提案特别是:

[编辑]

-防止将--add-exports、-add-reads 和--patch-module 与--release(任何版本)结合用于系统模块

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

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

我无法评论其基本原理,但从上面的引用来看,它与允许 JDK 9 与 JDK 10 一致工作有关。

  • 答案是正确的。`--release` 的想法是允许针对 *特定* 版本的 *public* API 进行编译,其签名被记录并与 javac 捆绑在一起。另一方面,`--add-exports` 及其朋友允许更改*当前* 版本的*私有*(以及公共)API。为了允许这些选项的组合,javac 需要记录所有版本的所有包和类。 (3认同)

小智 6

使用-target&-source代替:

-target 11 -source 11
Run Code Online (Sandbox Code Playgroud)