--release

时间:2017-07-28 09:47:03

标签: java javac java-9 jigsaw

我有以下程序:

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。

5 个答案:

答案 0 :(得分:3)

this bug ticket看来,--release无法与--add-exports--add-reads--patch-module结合使用。

从链接:

  

这里的总体建议是让--release 9一致地工作   在JDK 9和(预期)JDK 10之间,即使以a为代价   可能的不同命令行为如:
  $ <jdk9>/javac Test.java
  $ <jdk9>/javac --release 9 Test.java

此外:

  

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

     

特别提案是:

     

[编辑]

     

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

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

  

不允许从系统模块{0}导出包   --release

我不能对基本原理发表评论,但从上面的引用来看,它与允许JDK 9与JDK 10一致地工作有关。

答案 1 :(得分:1)

改为使用-target-source

-target 11 -source 11

答案 2 :(得分:0)

如果您使用的是IntelliJ主意,请尝试检查Java编译器设置:

转到“文件”菜单-> [设置]-> [构建,执行,部署]-> [Java编译器],然后检查“项目字节码版本”设置。我在使用JDK 11时遇到了类似的错误(“从系统模块java.datatransfer导出软件包,不允许使用--release”),而该值仍设置为版本9。将其设置为11可以解决我的问题。 / p>

Screenshot

答案 3 :(得分:0)

转到“文件”菜单-> [设置]-> [构建,执行,部署]-> [Java编译器] 并选择您的JDK版本。 (确保它高于JDK 11)

See the image below

答案 4 :(得分:0)

如果您使用的是InetlliJ Idea,请执行以下设置: 转到“文件”菜单-> [设置]-> [构建,执行,部署]-> [Java编译器],然后选择您的JDK版本(有时为空),因此请插入Java版本,例如[如果您使用11],然后保存, 然后编译程序并运行。