需确保 java -version 与 javac -version 版本号完全一致且路径匹配,JAVA_HOME 必须指向完整 JDK 根目录,并验证 Maven/Gradle 和 IDE 中的 JDK 配置是否统一。

确认 java -version 和 javac -version 是否一致
很多项目启动失败,根本原因在于运行时用的 JDK 版本和编译时用的不匹配。比如项目用 javac 17 编译了 .class 文件,但运行时 java 命令指向的是 JDK 8,就会报 UnsupportedClassVersionError。
执行以下命令检查:
java -version javac -version
注意两点:
- 输出的版本号必须完全一致(如都是
17.0.1,不只是大版本17) - 路径也得对得上:运行
which java和which javac(Linux/macOS)或where java(Windows),确保不是/usr/bin/java和/Library/Java/.../javac这种混用情况 - IDE(如 IntelliJ)可能自带 JRE,但终端里用的是系统默认 JDK,要分开验证
检查 JAVA_HOME 是否生效且指向完整 JDK 目录
JAVA_HOME 必须指向 JDK 根目录(含 bin、lib、jre 等子目录),不能只指向 bin 或 jre。设错会导致 Maven、Gradle 或 Tomcat 启动失败,报类似 The JAVA_HOME environment variable is not defined correctly 的错误。
立即学习“Java免费学习笔记(深入)”;
验证方式:
echo $JAVA_HOME # Linux/macOS echo %JAVA_HOME% # Windows
然后确认该路径下存在 bin/javac 和 lib/tools.jar(JDK 9+ 不再有 tools.jar,但应有 lib/jrt-fs.jar 或模块化结构)。
常见陷阱:
- macOS 安装 JDK 后
/usr/libexec/java_home -V显示多个版本,但JAVA_HOME指向了旧版残留路径 - Windows 用户在系统变量里设了
JAVA_HOME,但没重启 CMD 或 IDE,导致变量未加载 - 某些 Dockerfile 或 CI 脚本里硬编码了路径,而宿主机 JDK 升级后路径失效
Maven/Gradle 构建时提示 “No compiler is provided” 或 “source level not supported”
这通常不是 Maven 自身问题,而是它没正确读取到 JAVA_HOME 或项目配置了错误的 Java 版本。
分三步排查:
- 运行
mvn -v,看输出中Java version:和JAVA_HOME:是否与你预期一致 - 检查项目根目录下的
pom.xml,确认maven-compiler-plugin的和与本地 JDK 匹配(例如 JDK 17 项目不能写)21 - Gradle 项目需检查
build.gradle中的java.toolchain.version = 17(Gradle 17+ 推荐写法),而非仅靠sourceCompatibility
特别注意:Maven 默认使用 JAVA_HOME,但若 settings.xml 中配置了 ,会优先走 toolchain,此时 JAVA_HOME 失效。
IDE 启动报 “Cannot resolve symbol” 或 “Module not specified” 却能正常编译
这是典型的 IDE 缓存与实际环境脱节。IntelliJ/Eclipse 可能缓存了旧 JDK 路径、SDK 配置或模块依赖关系,但命令行构建不受影响。
快速修复步骤:
- IntelliJ:打开
File → Project Structure → Project,确认Project SDK和Project language level匹配本地 JDK;再点Modules,检查每个 module 的Language level和Dependencies是否有红色叹号 - 清除 IDE 缓存:
File → Invalidate Caches and Restart → Invalidate and Restart - Eclipse:右键项目 →
Properties → Java Build Path → Libraries,确认JRE System Library是“Workspace default JRE”且版本正确;若手动添加过 JRE,删掉重选
一个容易被忽略的点:多模块 Maven 项目中,父 pom.xml 的 里定义了 java.version,但子模块没继承或覆盖,导致 IDE 解析时语言级别错乱。










