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

问题描述 投票:7回答:3

我有以下程序:

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。

java javac java-9 jigsaw
3个回答
3
投票

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

从链接:

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

也:

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

特别是提案是:

[编辑]

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

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

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

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


1
投票

改为使用-target-source

-target 11 -source 11

0
投票

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

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

Screenshot

© www.soinside.com 2019 - 2024. All rights reserved.