必须在编译和运行两个环节都显式加--enable-preview,缺一不可;否则jvm拒绝加载含预览标记的字节码,直接抛unsupportedoperationexception。javac和java命令均需携带该参数,且jdk版本须严格匹配预览特性所属版本。

必须在编译和运行两个环节都显式加 --enable-preview,缺一不可;否则直接报错,不是配置没生效,而是 JVM 拒绝加载含预览标记的字节码。
javac 和 java 命令都要带 --enable-preview
Java 21 的预览特性(如 record patterns、string templates)生成的 class 文件会被打上特殊标记(minor version = 65535),JVM 运行时会校验该标记是否与当前启用状态匹配。
-
javac --enable-preview --release 21 Main.java:只加--enable-preview不够,推荐搭配--release 21,防止意外引用 JDK 22+ 的 API -
java --enable-preview Main:漏掉这一步,运行时抛UnsupportedOperationException: preview feature is not enabled - 用
-source 21 -target 21替代--release 21也行,但必须确保 JDK 主版本一致——JDK 21 下不能用-source 20启用 Java 21 预览语法
IDE 运行按钮默认不传 --enable-preview
IntelliJ 或 VS Code 界面勾选 “Enable preview features” 只改了编译参数,不会自动往 java 命令里塞 --enable-preview。点绿色三角运行失败,八成是这个原因。
- IntelliJ:进
Run → Edit Configurations → Modify options → Add VM options,手动填入--enable-preview - VS Code:在
.vscode/launch.json的vmArgs字段添加"--enable-preview" - 哪怕只是临时
java -cp . Main,也得写成java --enable-preview -cp . Main
Maven 和 Gradle 必须双端配置
构建工具不会自动同步编译和运行时开关,maven-compiler-plugin 和 maven-surefire-plugin 要分别设参,否则单元测试跑不过。
- Maven:在
pom.xml中同时配置maven-compiler-plugin的<compilerargs></compilerargs>和maven-surefire-plugin的<argline></argline> - Gradle:
compileJava.options.compilerArgs += ['--enable-preview']和test.jvmArgs = ['--enable-preview']缺一不可 - 用
mvn exec:java?还得单独配exec-maven-plugin的<arguments></arguments>,否则照样报IncompatibleClassChangeError
最易被忽略的是:预览特性生成的 class 文件有 JVM 版本绑定,JDK 21 编译的 --enable-preview 类,不能用 JDK 22 的 java 命令运行——哪怕你加了 --enable-preview,也会因 minor version 不匹配而拒绝加载。











