VS Code底部状态栏显示的JRE标识(如JavaSE-17)源自java.configuration.runtimes中"default": true的JDK,是语言服务器编译、测试、调试实际使用的主JDK,独立于系统java -version和终端JAVA_HOME;执行“Java: Check Language Server Status”可权威确认其路径、版本及启动参数,是定位Unsupported class file major version等问题的根本依据。

看底部状态栏的 JRE 标识最直接
打开任意 .java 文件,VS Code 窗口右下角会显示当前语言服务器正在用的 JRE 版本,比如 JavaSE-17 或 21。这个值来自 java.configuration.runtimes 中标记 "default": true 的那个 JDK,也是测试运行时实际加载的版本。
注意:它不等于系统 java -version 输出,也不受终端当前 JAVA_HOME 影响 —— 这是 VS Code Java 扩展自己选的、用于编译 + 测试 + 调试的“主 JDK”。
运行 Java: Check Language Server Status 查权威路径
按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入并执行:Java: Check Language Server Status。输出面板里会明确列出:
-
jdt.ls.java.home:语言服务器启动时读取的 JDK 路径 -
java.version:该 JDK 的具体版本号(如21.0.2) -
vmArgs:是否加了--enable-preview等影响测试行为的参数
这是唯一能确认“测试时 JVM 实际从哪来、带什么参数启动”的方式。很多问题(比如 Unsupported class file major version)就靠这里定位根因。
别忽略 java.test.library 和 testRunner 配置
VS Code 默认用 JUnit 5 启动测试,但它的类路径依赖两个关键配置:
-
java.test.library:决定用 JUnit 4 还是 5(值为junit5或junit4),不同版本对 Java 语言级别支持不同 -
java.test.runner:若设为maven或gradle,则测试实际由构建工具执行,此时真正生效的是pom.xml里的或build.gradle中的sourceCompatibility
也就是说:点击“Run Test”按钮时,VS Code 可能只是转发命令给 Maven —— 那么你改了 java.home 却没同步改 pom.xml,测试照样用错 JDK。
终端里跑 mvn test 为什么版本不对?
因为 Maven 不看 java.home,它只认系统环境变量:
-
JAVA_HOME决定mvn自身运行的 JVM -
maven.compiler.source和maven.compiler.target决定编译出的字节码版本 - 而测试阶段的
forkMode或argLine才决定测试用哪个 JVM 启动
常见坑:VS Code 底部显示 JavaSE-21,但 mvn test 报错 class file major version 65(对应 JDK 21),说明 Maven 编译用了 JDK 21,但测试 fork 出来的 JVM 是 JDK 8 —— 此时得检查 maven-surefire-plugin 的 配置项是否指向了旧 JDK。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











