java 14+启用预览特性需同时满足:使用对应jdk版本、--enable-preview置于主类名前、编译与运行阶段均显式开启、ide/maven/gradle中分别配置,且--release会禁用预览特性。

Java 14+ 编译时加 --enable-preview 报错“unrecognized option”
不是参数写错了,是 JDK 版本或命令位置不对。预览特性从 Java 14 开始支持,但必须用对应版本的 javac 和 java,且 --enable-preview 必须放在主类名(或 -jar)之前,不能塞在 JVM 参数(-Xmx 等)后面。
-
javac --enable-preview --release 17 MyRecord.java✅(编译阶段启用) -
java --enable-preview MyRecord✅(运行阶段也得显式开启) -
java -Xmx2g --enable-preview MyRecord❌(JVM 参数和预览开关混在一起,顺序错) - JDK 11 或更老版本直接忽略该参数,不报错但也不生效
IDEA / Maven 中启用预览特性总失效
IDE 是独立管理编译和运行环境的,光改终端命令没用。Maven 要在 pom.xml 里明确指定 compilerArgs 和 fork,IDEA 则需分别配置编译器和运行配置。
- Maven 的
maven-compiler-plugin需同时设source、target和compilerArgs:<configuration> <source>21</source> <target>21</target> <compilerArgs><arg>--enable-preview</arg></compilerArgs> <fork>true</fork> </configuration>
- IntelliJ IDEA:File → Settings → Build → Compiler → Java Compiler → Target bytecode version 设为对应版本,并勾选 “Enable preview features”
- 运行配置里也要手动加
--enable-preview到 “VM options”,否则编译过了,运行仍抛IncompatibleClassChangeError
用了 record 或 switch 表达式却提示“not supported”
这是典型“只开了编译没开运行”,或者用了不匹配的 --release。预览特性必须全程一致:编译、运行、字节码目标版本三者对齐,且不能靠 --release 屏蔽掉预览支持。
-
javac --enable-preview --release 17 MyRecord.java❌(--release会禁用所有预览 API) - 正确写法是去掉
--release,改用--source 21 --target 21,再配--enable-preview - 运行时若漏掉
--enable-preview,会报java.lang.UnsupportedClassVersionError: Preview features are not enabled - Gradle 用户注意:
compileJava.options.encoding = "UTF-8"这类设置不会自动继承--enable-preview,必须显式加options.compilerArgs += ["--enable-preview"]
为什么有些预览特性在 Java 17(LTS)里仍需手动开启
因为它们还没转正。比如 sealed 类在 Java 17 是预览,到 Java 18 才第二次预览,Java 20 才正式落地。JVM 强制要求显式声明,是防止代码意外依赖未稳定语法,导致升级后崩溃。
立即学习“Java免费学习笔记(深入)”;
- 查某个特性是否已转正,看 Oracle 官方 JEP 页面状态(如 JEP 409 sealed classes → “Targeted to JDK 20”)
- 生产环境慎用预览特性,CI/CD 流水线中 JDK 升级可能让构建突然失败
- Spring Boot 3.x 默认要求 Java 17+,但若你用了
pattern matching for switch(Java 21 预览),就得确保所有环境 JDK ≥21 且都带--enable-preview
预览特性的开关不是开关灯,它是一条贯穿编译、打包、部署、运行的链路,漏掉任意一环都会在最意想不到的时候报错。










