导出从系统模块的封装是不允许用--release
我有以下程序:导出从系统模块的封装是不允许用--release
// 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
时出现。
从链接:
这里的整体建议是让让--release 9工作持续 JDK 9,(预计)JDK 10之间,甚至在 可能不同行为的成本的命令,如:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java
另外:
考虑到--release的意图,应允许 针对给定的JDK版本使用受支持的API的编译代码。
在具体的建议是:
[编辑]
-prevents使用--add-出口,-add-读取并结合--patch模块为系统模块 - 释放(任何版本)
Here是包含文件的diff:
从系统模块导出包{0}不是人lowed与 --release
我不能理发表评论,但来自上述报价,它涉及到允许JDK 9 @Tavo这个问题是关于'与JDK 10
那么,Java 10将不允许从平台模块中导出包? – ZhekaKozlov
Java 10将不允许从平台模块中组合'--release'和导出包。我不确定我们可以得出结论,只有'--add-exports'在Java 10中不可用。这是一个单独的问题。请接受最能回答您原始问题的答案。 –
答案是正确的。 '--release'的思想是允许针对特定版本*的* public * API进行编译,其签名被记录并与javac捆绑在一起。另一方面,'--add-exports'及其朋友允许更改* current *版本的* private *(以及public)API。要允许这些选项的组合,javac需要记录所有版本的所有包和类。 –
工作始终 - -add-exports'。我的问题是关于'--add-exports'和'--release'的组合,这使得它完全不同。 – ZhekaKozlov
同意,我将删除评论:) – Tavo
正如迈克尔复活节所说的,这些选项的组合已被javac禁止,所以现在IDEA开发人员可以调整它们的编译器调用。我提交了https://youtrack.jetbrains。com/issue/IDEA-176994 - 希望它很快就会被修复。 –