--release 不允许从系统模块导出包
Exporting a package from system module is not allowed with --release
我有以下程序:
模块-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
结合使用。
来自link:
The overall proposal here is to get make --release 9 work consistently
between JDK 9 and the (anticipated) JDK 10, even at the cost of a
possible different behavior of commands like:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java
还有:
Which should be acceptable, given the intents of --release - allow to
compile code using supported APIs for the given JDK release.
In particular the proposal is to:
[edit]
-prevents use of --add-exports, -add-reads and --patch-module for system modules in combination with --release (any version)
Here 是包含以下内容的文件差异:
exporting a package from system module {0} is not allowed with
--release
我无法对理由发表评论,但从上面的引述来看,它与允许 JDK 9 与 JDK 10 一致地工作有关。
如果您使用的是 IntelliJ idea,请尝试检查您的 Java 编译器设置:
转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 并检查设置 "Project bytecode version"。我在使用 JDK 11 时遇到了类似的错误 ("exporting a package from system module java.datatransfer is not allowed with --release"),而此值仍设置为版本 9。将其设置为 11 解决了我的问题。
改用-target
& -source
:
-target 11 -source 11
转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器]
和 select 你的 JDK 版本。 (确保高于JDK11)
如果您使用的是 InetlliJ Idea,请执行以下设置:
转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 和 select 你的 JDK 版本,有时这是空的,所以插入java 版本如 [if you use 11] 并保存,
然后编译程序和运行.
如果你用的是IntelliJ,还有更好的解决办法。
只需取消选中 Java 编译器设置中的“使用‘--release’选项”复选框
我有以下程序:
模块-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.
我正在使用 JDK 9+178。
从this bug ticket看来,--release
不能与--add-exports
、--add-reads
和--patch-module
结合使用。
来自link:
The overall proposal here is to get make --release 9 work consistently between JDK 9 and the (anticipated) JDK 10, even at the cost of a possible different behavior of commands like:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java
还有:
Which should be acceptable, given the intents of --release - allow to compile code using supported APIs for the given JDK release.
In particular the proposal is to:
[edit]
-prevents use of --add-exports, -add-reads and --patch-module for system modules in combination with --release (any version)
Here 是包含以下内容的文件差异:
exporting a package from system module {0} is not allowed with --release
我无法对理由发表评论,但从上面的引述来看,它与允许 JDK 9 与 JDK 10 一致地工作有关。
如果您使用的是 IntelliJ idea,请尝试检查您的 Java 编译器设置:
转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 并检查设置 "Project bytecode version"。我在使用 JDK 11 时遇到了类似的错误 ("exporting a package from system module java.datatransfer is not allowed with --release"),而此值仍设置为版本 9。将其设置为 11 解决了我的问题。
改用-target
& -source
:
-target 11 -source 11
转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 和 select 你的 JDK 版本。 (确保高于JDK11)
如果您使用的是 InetlliJ Idea,请执行以下设置: 转到文件菜单 -> [设置] -> [构建、执行、部署] -> [Java 编译器] 和 select 你的 JDK 版本,有时这是空的,所以插入java 版本如 [if you use 11] 并保存, 然后编译程序和运行.
如果你用的是IntelliJ,还有更好的解决办法。
只需取消选中 Java 编译器设置中的“使用‘--release’选项”复选框