我有以下程序:
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选项成功编译:
--add-exports
> javac --add-exports java.base/sun.nio=a module-info.java Main.java
但是,当我添加--release参数时,它将失败:
--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。
这似乎从这个bug票是--release不能结合使用--add- exports,--add-reads和--patch-module。
--add- exports
--add-reads
--patch-module
从链接:
这里的总体建议是使make –release 9在JDK 9和(预期的)JDK 10之间保持一致的工作,即使是以类似以下命令的可能不同行为为代价的: $ <jdk9>/javac Test.java $ <jdk9>/javac --release 9 Test.java
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java
也:
鉴于–release的意图,这应该可以接受-允许使用给定JDK版本的受支持API编译代码。 该提案尤其是要: [编辑] -防止将–add-exports,-add-reads和–patch-module与–release(任何版本)结合用于系统模块
鉴于–release的意图,这应该可以接受-允许使用给定JDK版本的受支持API编译代码。
该提案尤其是要:
[编辑]
-防止将–add-exports,-add-reads和–patch-module与–release(任何版本)结合用于系统模块
这是包含以下内容的文件差异:
--release不允许从系统模块{0}导出软件包
我无法评论其基本原理,但从上面的引用中可以看出,这与允许JDK 9与JDK 10一致地工作有关。