14

我有以下程序:

模块信息.java

module a {
}

主.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。

4

6 回答 6

9

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

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

截屏

于 2019-04-06T08:12:02.770 回答
8

这个 bug 票看来,--release不能与--add-exports--add-reads和结合使用--patch-module

从链接:

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

还:

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

具体而言,该提案旨在:

[编辑]

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

是包含的文件差异:

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

我无法评论其基本原理,但从上面的引述来看,它与允许 JDK 9 与 JDK 10 一致地工作有关。

于 2017-07-30T18:19:01.243 回答
8

使用-target&-source代替:

-target 11 -source 11
于 2019-04-25T16:25:20.480 回答
3

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

见下图

于 2020-03-22T19:28:11.717 回答
0

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

于 2020-04-15T17:45:27.893 回答
0

如果您使用 IntelliJ,则有更好的解决方案。只需取消选中 Java 编译器设置中的“使用 '--release' 选项”复选框 在此处输入图像描述

于 2021-11-09T03:53:31.530 回答