导出从系统模块的封装是不允许用--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。

+0

工作始终 - -add-exports'。我的问题是关于'--add-exports'和'--release'的组合,这使得它完全不同。 – ZhekaKozlov

+0

同意,我将删除评论:) – Tavo

+0

正如迈克尔复活节所说的,这些选项的组合已被javac禁止,所以现在IDEA开发人员可以调整它们的编译器调用。我提交了https://youtrack.jetbrains。com/issue/IDEA-176994 - 希望它很快就会被修复。 –

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

+0

那么,Java 10将不允许从平台模块中导出包? – ZhekaKozlov

+0

Java 10将不允许从平台模块中组合'--release'和导出包。我不确定我们可以得出结论,只有'--add-exports'在Java 10中不可用。这是一个单独的问题。请接受最能回答您原始问题的答案。 –

+2

答案是正确的。 '--release'的思想是允许针对特定版本*的* public * API进行编译,其签名被记录并与javac捆绑在一起。另一方面,'--add-exports'及其朋友允许更改* current *版本的* private *(以及public)API。要允许这些选项的组合,javac需要记录所有版本的所有包和类。 –