我正在尝试使用 JDK 11 进行编译,但在 IntelliJ 中以 Java 1.8 为目标。我已经配置了:
- 项目设置:
- 项目SDK:11
- 项目语言水平:8
- Java 编译器设置:
- 使用"--release"选项进行交叉编译(Java 9 及更高版本)
- 项目字节码版本:8
- 模块设置:
- 项目软件开发工具包 (11)
- 语言级别:项目默认值(8 - Lambda、类型注释等)
我收到一堆编译错误,说内部包不存在。--add-exports
对--target 1.8
无效,因此无济于事。
唯一有效的方法是将项目 SDK 设置回 Java 1.8(这在尝试使用 Java 11 运行时会导致其他问题,但这是另一个问题)。
是否可以使用 JDK 11 进行编译并在 IntelliJ 中面向 Java 1.8?
还有其他相关问题似乎有效,但不适用于IntelliJ:
- 如何在 Java 11 中生成代码,但针对 Java 8 及更高版本?
- 迁移到 OpenJDK-11,但用 Java 8 编译
不幸的是,如果使用--release N
选项进行编译,则无法使用内部 API。JEP 247 中对此进行了描述:
定义了一个新的命令行选项 --release,它会自动 配置编译器以生成将链接到的类文件 给定平台版本的实现。--释放 N 是 大致相当于:
对于 N <9: -source N -target N -bootclasspath
, 对于 N>= 9:-source N -target N --system
。
然后是主要段落:
对于 N <9,记录的 API 由位于javac 为 JDK N 提供的默认引导类路径。
我同意这实际上是一个很大的限制。你甚至不能使用sun.misc.Unsafe,它一直是OpenJDK的关键部分。
所以,你的问题与IntelliJ IDEA无关。这是Java平台的限制。
您有两种方法:
- 不要使用内部 API
- 使用 JDK 8 进行编译