需确认JAVA_HOME和PATH指向同一JDK版本,因javac与java版本不一致会导致编译错误;应检查命令路径、版本号、PATH顺序、IDE SDK配置、Maven/Gradle的java.home设置及Windows注册表残留。

确认 JAVA_HOME 和系统 PATH 是否指向同一 JDK 版本
很多编译错误(如 error: invalid flag: --release 或 package java.util.stream does not exist)其实不是代码问题,而是 javac 和 java 命令实际调用的 JDK 不一致。常见于 macOS/Linux 的 shell 配置(~/.zshrc 或 ~/.bash_profile)里 JAVA_HOME 指向 JDK 17,但 PATH 开头却包含 /usr/bin 或 Homebrew 安装的旧版 javac。
- 运行
which javac和which java查看命令路径 - 运行
javac -version和java -version对比输出版本号 - 检查
$JAVA_HOME/bin是否在PATH最前面,例如:export PATH=$JAVA_HOME/bin:$PATH - 修改后务必
source ~/.zshrc(或对应 shell 配置文件),再新开终端验证
IDE(IntelliJ / Eclipse)的项目 SDK 和编译器级别是否匹配
即使终端中 javac 正常,IDE 仍可能使用内置或独立配置的 JDK 和语言级别,导致“明明能编译,IDE 却报红”或“IDE 能跑,命令行编译失败”。
- IntelliJ:File → Project Structure → Project →
Project SDK和Project language level必须一致(如都设为17) - Eclipse:右键项目 → Properties → Java Build Path → Libraries → 右侧选中 JRE System Library → Edit → 选择正确安装的 JDK
- Maven 项目还需检查
pom.xml中maven-compiler-plugin的source和target是否与 JDK 匹配,例如 JDK 17 应设为17,而非8或21
多 JDK 共存时,Maven 或 Gradle 使用了错误的 java.home
Maven 和 Gradle 默认不读取系统 JAVA_HOME,尤其在 IDE 内运行时,可能沿用 IDE 自带的 JVM 或配置文件中硬编码的路径。典型表现是:命令行 mvn compile 成功,但 IDE 里 Maven 控制台报 Unsupported class file major version 61(即 JDK 17 编译的类被 JDK 11 加载)。
- Gradle:检查
gradle.properties是否有org.gradle.java.home=/path/to/jdk17;没有就加上 - Maven:检查
~/.m2/settings.xml或 IDE Maven 设置中是否指定了java.home;也可临时用mvn -Dmaven.compiler.source=17 -Dmaven.compiler.target=17 compile测试 - IDEA 中 Maven → Runner →
JRE下拉框必须选“Project default”,而非 “Bundled (OpenJDK 11)” 类似选项
Windows 上注册表残留或旧版 JDK 卸载不干净
Windows 用户常遇到:卸载了 JDK 8,但新建 CMD 窗口执行 javac -version 仍显示 1.8 —— 这通常是因为注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit 下仍有旧路径,或系统环境变量被第三方软件(如 Android Studio、旧版 Eclipse)重写。
立即学习“Java免费学习笔记(深入)”;
- 打开注册表编辑器,定位到上述路径,删除所有指向已卸载 JDK 的子项
- 检查系统变量
PATH中是否残留类似C:\Program Files\Java\jdk1.8.0_291\bin的条目 - 运行
where javac查看所有匹配路径,逐个确认是否存在 - 若用 Chocolatey 或 Scoop 安装过 JDK,记得也通过对应包管理器卸载,避免冲突
java -XshowSettings:properties -version 2>&1 | grep "java.home"
这条命令能直接暴露当前 JVM 实际加载的 java.home,比查环境变量更可靠。真正的问题往往藏在“你以为它用的是哪个 JDK”,和“它实际加载的是哪个 JDK”之间的偏差里。










