最可靠的方式是运行 system.out.println(runtime.version()) 获取 jvm 实际加载版本;其次通过 /usr/libexec/java_home -v(macos)、sudo update-alternatives --list java(linux)或环境变量与 path 人工核对(windows)验证系统注册 jdk。

直接运行 java -version 是最常用的方式,但它只反映当前终端中 PATH 最前面那个 java 可执行文件的版本,不等于项目实际编译或运行时用的 JDK。
看命令行输出是否真实有效
先确认这个结果可靠:
- 执行
where java(Windows)或which java(macOS/Linux),看路径是否指向你预期的 JDK 的bin目录 - 检查
PATH中有没有残留旧 JDK 的硬编码路径(比如C:\Program Files\Java\jdk1.8.0_291\bin),有就删掉——它会优先于%JAVA_HOME%\bin生效 - 在 Windows 上,
set JAVA_HOME显示的值只是参考,真正起作用的是PATH顺序;在 macOS/Linux 上,echo $JAVA_HOME需配合export PATH=$JAVA_HOME/bin:$PATH才能确保一致
查系统级注册信息(更权威)
绕过 shell 配置,直击系统识别逻辑:
-
macOS:运行
/usr/libexec/java_home -V,列出所有被系统识别的 JDK;再用/usr/libexec/java_home -v 17看 JDK 17 的确切路径 -
Linux(Ubuntu/Debian):运行
sudo update-alternatives --list java和--list javac,确认两者注册路径一致 -
Windows:没有等效机制,需人工核对
System Properties → Environment Variables中JAVA_HOME值是否为%JAVA17_HOME%类变量,且Path顶部是%JAVA_HOME%\bin
验证项目实际使用的版本
IDE 和构建工具常“另起炉灶”,和终端脱节:
- 在 IntelliJ:打开 File → Project Structure → Project,看 Project SDK 和 Language level 是否匹配
- 在 VS Code:打开
.vscode/settings.json,确认"java.home"指向正确路径,并执行命令 Java: Check Language Server Status - 运行时确认:在代码里加一行
System.out.println(Runtime.version());,它返回 JVM 实际加载的版本对象,不受环境变量干扰
避免常见误判
这几个信号说明你看到的不是真相:
-
java -version显示 JDK 17,但 Maven 编译报错UnsupportedClassVersionError: Class version 61.0→ 构建工具用了旧 JDK - IDE 不报错,但运行时报
java.lang.Record is not supported→ 项目语言级别设低了,没开 record 支持 -
mvn -v显示 JDK 11,java -version显示 JDK 17 → Maven 忽略JAVA_HOME,按自己配置或update-alternatives走











