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

Java 不允许使用--release从系统模块导出包,java,javac,java-9,java-platform-module-system,Java,Javac,Java 9,Java Platform Module System,我有以下计划: 模块信息.java module a { } public class Main { public static void main(String[] args) { System.out.println(sun.nio.ByteBuffered.class); } } Main.java module a { } public class Main { public static void main(String[] args) {

我有以下计划:

模块信息.java

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

module a {
}
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。

从中可以看出,
--release
不能与
--add exports
--add reads
--patch module
结合使用

从链接:

这里的总体建议是让make-release9能够始终如一地工作 在jdk9和(预期的)jdk10之间,即使代价是 命令的可能不同行为,如:
$/javac Test.java

$/javac--9版Test.java

此外:

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

建议特别是:

[编辑]

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

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

不允许使用从系统模块{0}导出包 --释放


我不能评论其基本原理,但从上面的引文来看,它涉及到允许JDK 9与JDK 10一致地工作

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


转到文件菜单->[Settings]->[Build,Execution,Deployment]->[Java Compiler]并检查设置“Project bytecode version”。在使用JDK 11时,当该值仍设置为版本9时,我遇到了类似的错误(“从系统模块java导出包。不允许使用--release导出数据传输”)。将其设置为11为我解决了问题


使用
-target
-source
代替:

-target 11 -source 11

转到文件菜单->[Settings]->[Build,Execution,Deployment]->[Java编译器] 并选择您的JDK版本。(确保它高于JDK 11)


如果您使用的是InetlliJ Idea,请执行以下设置: 转到文件菜单->[Settings]->[Build,Execution,Deployment]->[Java Compiler],然后选择您的JDK版本,有时它是空的,因此插入Java版本,如[if you use 11]并保存,
然后编译程序并运行。

@Tavo这个问题是关于
--添加导出的。我的问题是关于
--add exports
--release
的组合,这使得它完全不同。正如Michael Easter正确地说的,这种选项组合在javac中是被禁止的,因此现在是IDEA开发人员调整其编译器调用的时候了。我已经提交了-希望它很快会被修复。@StanislavLukyanov谢谢你的错误报告!我想做,但没有机会和时间。@StanislavLukyanov我想这是固定的想法。我刚刚尝试了2017.2.5,一切正常。因此,Java 10不允许从平台模块导出包?Java 10不允许将
--release
与从平台模块导出包相结合。我不确定我们能否得出结论,Java 10中只有
--add exports
不可用。这是另一个问题。请接受最能回答您原始问题的答案。答案是正确的。
--release
的思想是允许针对特定发行版的公共API进行编译,其签名被记录并与javac捆绑在一起。另一方面,
--addexports
及其好友允许更改当前版本的私有(以及公共)API。为了允许这些选项的组合,javac需要记录所有版本的所有包和类。@StanislavLukyanov,我想是这样的--release正在替换交叉编译所需的--source--target和--bootclasspath参数(例如,使用jdk9编译为java6):@StanislavLukyanov您愿意考虑将其从注释转移到答案吗?一旦你这么做了,请给我一个悬赏的标签。这不是一个通用的解决方案--发布具有特殊含义: