必须同时在javac和java命令中添加--enable-preview,且JDK版本严格匹配;编译与运行缺一不可,顺序须正确(--enable-preview置于主类名前),否则抛UnsupportedOperationException或IncompatibleClassChangeError。

javac 和 java 命令必须都加 --enable-preview
只在编译时加 --enable-preview,运行时漏掉,会直接抛 UnsupportedOperationException: preview feature is not enabled;反过来,只在运行时加,编译阶段就过不了——javac 根本不认识预览语法,比如 record 或 Thread.ofVirtual() 会报错“not supported”。两者必须同步启用,且 JDK 主版本严格匹配(如 Java 21 的虚拟线程不能用 JDK 22 的 javac 编译)。
正确顺序很重要:--enable-preview 必须放在主类名或 -jar 之前,不能混在 JVM 参数里:
-
javac --enable-preview --release 21 Main.java✅ -
java --enable-preview Main✅ -
java -Xmx2g --enable-preview Main❌(--enable-preview被当成了程序参数)
Maven 项目要改两个地方:编译插件和测试/运行插件
Maven 不会自动把编译参数透传到运行时。光配 maven-compiler-plugin 的 <compilerArgs> 只影响 compile 阶段,mvn test 或 mvn exec:java 仍会失败。
必须显式配置:
-
maven-compiler-plugin中设<compilerArgs>--enable-preview</compilerArgs>和<source>21</source>(不能用--release,它会禁用预览) -
maven-surefire-plugin(测试)或maven-exec-plugin(运行)中加<jvmArgs>--enable-preview</jvmArgs>
漏掉任一环节,就会出现“编译通过、运行报错 IncompatibleClassChangeError”——因为启用了预览特性的 class 文件带特殊字节码标记(minor version 65535),JVM 拒绝加载未声明支持的类。
VS Code 调试必须写进 launch.json 的 vmArgs
很多人误以为在 settings.json 里配 "vmargs": ["--enable-preview"] 就够了,其实那是给 Java 语言服务器(JDT LS)自己用的,和你的代码运行完全无关。
真正生效的位置是 .vscode/launch.json 的调试配置里:
- 用
vmArgs(注意拼写,不是vmargs或args)字段传参 -
args是传给main(String[] args)的,不是 JVM 参数 -
vmArgs是字符串类型,多个参数用空格隔开,例如:"--enable-preview --XX:+UnlockExperimentalVMOptions"
不这么配,点绿色三角运行,照样报 UnsupportedOperationException。
IDEA 里编译和运行配置是分开的
IDEA 的 “Enable preview features” 复选框只改了编译器参数,不影响运行配置。你可能看到编辑器不报红、编译成功,但点击运行按钮立刻崩。
必须手动检查两处:
- File → Settings → Build → Compiler → Java Compiler → 勾选 Enable preview features,并设 Target bytecode version 为对应版本(如 21)
- 运行配置(Run → Edit Configurations…)→ 在 VM options 栏填入
--enable-preview
哪怕只是临时跑个 java -cp . Main,漏掉 --enable-preview 就会触发字节码校验失败——这个限制不是警告,是硬性拒绝加载。


















