我有以下程序:
module-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
结合使用。
从链接:
这里的总体建议是让JDK 9和(预期的)JDK 10之间的make -release 9一致地工作,即使代价可能是不同的命令行为,例如:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java
也:
考虑到--release的意图,允许使用受支持的API为给定的JDK版本编译代码,这应该是可接受的。
特别是提案是:
[编辑]
- 防止将--add-exports,-add-reads和--patch-module与--release(任何版本)结合使用系统模块
Here是包含以下内容的文件差异:
使用--release不允许从系统模块{0}导出包
我不能对基本原理发表评论,但从上面的引用来看,它适用于允许JDK 9与JDK 10一致地工作。
改为使用-target
和-source
:
-target 11 -source 11