java - 如何在 IntelliJ 中使用 Java 11 编译目标 Java 1.8
问题描述
我正在尝试使用 JDK 11 进行编译,但在 IntelliJ 中以 Java 1.8 为目标。我已经配置:
- 项目设置:
- 项目 SDK:11
- 项目语言等级:8
- Java 编译器设置:
- 使用“--release”选项进行交叉编译(Java 9 及更高版本)
- 项目字节码版本:8
- 模块设置:
- 项目 SDK (11)
- 语言级别:项目默认值(8 - Lambda、类型注释等)
我收到一堆编译错误,说内部包不存在。--add-exports
无效,--target 1.8
因此无济于事。
唯一可行的是将 Project SDK 设置回 Java 1.8(这在尝试使用 Java 11 运行时会导致其他问题,但这是另一个问题)。
是否可以在 IntelliJ 中使用 JDK 11 进行编译并以 Java 1.8 为目标?
还有其他相关问题似乎有效,但不是来自 IntelliJ:
解决方案
--release N
不幸的是,如果您使用该选项进行编译,则无法使用内部 API 。这在JEP 247中有描述:
定义了一个新的命令行选项 --release,它自动配置编译器以生成将链接到给定平台版本的实现的类文件。--release N 大致相当于:
对于 N < 9:-source N -target N -bootclasspath <documented-APIs-from-N>,
对于 N >= 9:-source N -target N --system <documented-APIs-from-N>。
然后是主要段落:
对于 N < 9,记录的 API 包含位于 javac JDK N 的默认引导类路径上的公共 API 。
我同意这实际上是一个很大的限制。你甚至不能使用一直是 OpenJDK 关键部分的 sun.misc.Unsafe。
因此,您的问题与 IntelliJ IDEA 无关。这是Java平台的限制。
你有两种方法:
- 不要使用内部 API
- 使用 JDK 8 进行编译
推荐阅读
- java - 如果设备时间与 WhatsApp 等 Android Studio 中的互联网时间不匹配,如何显示错误
- javascript - 为什么我的过渡在引导导航上不起作用?
- excel - 如何根据单元格中的值将Excel行拆分为多个
- python - 安装包时出现 Conda 和 Anaconda 错误 (pythonOCC)
- javascript - 任何人都可以解释如何在这个功能组件中使用目标属性
- java - 在适配器的多个 TextView 中显示字符串
- python - 为特定国家生成随机坐标
- javascript - 如何使用自定义字母表生成 GUID,其行为类似于 MD5 哈希(在 JavaScript 中)?
- primefaces - primefaces 8升级后输入数字组件不起作用
- php - 选择输入 TYPO3 v9 Symfony 命令