java - 如何在 IntelliJ 中使用 Java 11 目标 Java 1.8 进行编译

标签 java intellij-idea java-8 java-11

我正在尝试使用 JDK 11 进行编译,但在 IntelliJ 中以 Java 1.8 为目标。我已经配置:

  • 项目设置:
    • 项目 SDK:11
    • 项目语言水平:8
  • Java 编译器设置:
    • 使用“--release”选项进行交叉编译(Java 9 及更高版本)
    • 项目字节码版本:8
  • 模块设置:
    • 项目 SDK (11)
    • 语言水平:项目默认(8 - Lambdas、类型注释等)

我收到一堆编译错误,说内部包不存在。 --add-exports--target 1.8 无效,所以这没有帮助。

唯一可行的方法是将 Project SDK 设置回 Java 1.8(这在尝试使用 Java 11 运行时会导致其他问题,但这是另一个问题)。

是否可以在 IntelliJ 中使用 JDK 11 进行编译并以 Java 1.8 为目标?

还有其他相关问题似乎有效但不是来自 IntelliJ:

最佳答案

不幸的是,如果您使用 --release N 选项进行编译,则不能使用内部 API。这在 JEP 247 中有描述。 :

A new command-line option, --release, is defined, which automatically configures the compiler to produce class files that will link against an implementation of the given platform version. --release N is roughly equivalent to:

for N < 9: -source N -target N -bootclasspath <documented-APIs-from-N>,

for N >= 9: -source N -target N --system <documented-APIs-from-N>.

然后是主要段落:

For N < 9, the documented APIs consist of the public APIs that were on javac's default bootclasspath for JDK N.

我同意这实际上是一个很大的限制。您甚至不能使用 sun.misc.Unsafe,它一直是 OpenJDK 的关键部分。

因此,您的问题与 IntelliJ IDEA 无关。这是 Java 平台的限制。

你有两种方式:

  • 不要使用内部 API
  • 使用JDK 8编译

关于java - 如何在 IntelliJ 中使用 Java 11 目标 Java 1.8 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55603018/

相关文章:

java - 找到流的最小元素,但如果 <= N 则尽早退出

java - 当实现谓词而不是 boolean 值时

java - Stream、Map、Reduce……是怎么做到的?

java - Jetty 热代码部署

java - IntelliJ IDEA当前运行目录的问题

java - IntelliJ理念14 : How do I import all existing idea modules in a folder tree into a project

java - 静态抽象内部类访问外部类私有(private)字段java时编译器错误

java - 用户重新定位 float 操作按钮

mysql - Spring Boot 应用程序运行正常,但 hibernate 和 MySql 相关属性不起作用

java - boolean 值流,是真的吗?