JAVA_HOME必须指向JDK根目录(如C:\jdk\temurin-17),不可含\bin后缀;PATH需添加%JAVA_HOME%\bin,且须重启终端验证echo %JAVA_HOME%、java -version和javac -version三者一致。

JAVA_HOME 必须指向 JDK 根目录,不是 bin 子目录
这是最常出错的地方:很多人把 JAVA_HOME 设成 C:\jdk\temurin-17\bin,结果 Maven 报错找不到 tools.jar,IDEA 提示 SDK 不完整。Windows 下的 Java 工具链(包括 javac、javadoc、jar)依赖 JAVA_HOME 指向包含 lib、bin、jre(旧版)等子目录的顶层路径。只要路径里有 bin\java.exe 和 lib\tools.jar(JDK 17+ 已移除该文件但仍有 lib\jrt-fs.jar 等等效资源),就说明是正确根目录。
- ✅ 正确示例:
C:\jdk\temurin-17、D:\Java\jdk-21.0.3 - ❌ 错误示例:
C:\jdk\temurin-17\bin、C:\Program Files\Eclipse Adoptium\jdk-21.0.6.7-hotspot\(末尾多一个反斜杠可能被某些工具截断) - ⚠️ 若路径含空格(如
C:\Program Files\...),不加引号也能工作,但 Go 的exec.Command("java", ...)或批处理脚本可能解析失败 —— 推荐一开始就选无空格路径,比如C:\jdk\jdk-21
变量名必须是全大写 JAVA_HOME,大小写敏感
Windows 环境变量名区分大小写。设成 java_home 或 Java_Home 后,mvn compile 会静默 fallback 到注册表或默认路径,导致你改了变量却没生效;IntelliJ 也会在 Project SDK 页面显示 “No SDK” 或灰色不可选状态。
- 新建系统变量时,变量名栏务必输入:
JAVA_HOME - PowerShell 中验证用:
$env:JAVA_HOME;CMD 中用:echo %JAVA_HOME% - 若返回空或报错,说明变量名拼错,或你编辑的是「用户变量」而非「系统变量」(多数工具只读系统级)
PATH 中必须添加 %JAVA_HOME%\bin,且建议置顶
只设 JAVA_HOME 不够 —— 命令行敲 java -version 能运行,靠的是 PATH 找到 java.exe。而 %JAVA_HOME%\bin 是唯一能随 JDK 版本切换自动更新的写法。如果之前装过 Oracle JDK,它的路径(如 C:\Program Files\Java\jdk1.8.0_291\bin)很可能还在 Path 里,且排在前面,导致 java -version 显示旧版本。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 编辑
Path时,在列表顶部点「新建」,填入:%JAVA_HOME%\bin - 不要手写绝对路径,也不要加引号(
"%JAVA_HOME%\bin"❌) - 改完后,**必须关闭所有已打开的 CMD/PowerShell/IDE 窗口,再新开一个**,否则环境变量不会刷新
验证三步缺一不可:echo %JAVA_HOME%、java -version、javac -version
只跑 java -version 成功,不代表配置完整。有些 MSI 安装包会自己往 Path 里加一条绝对路径,但没设 JAVA_HOME,这时 javac 可能缺失(尤其 ZIP 解压版),Maven 编译直接失败。
立即学习“Java免费学习笔记(深入)”;
-
echo %JAVA_HOME%输出应是你设置的完整根路径,不含\bin -
java -version和javac -version输出版本号必须一致(比如都是17.0.12+7),否则说明java和javac来自不同 JDK - 若
javac报“不是内部或外部命令”,检查bin目录下是否存在javac.exe—— 如果没有,你解压的是 JRE 包,不是 JDK 包
JAVA_HOME 和 PATH 全对,Go、Python subprocess、Gradle wrapper 在某些场景下仍会因路径解析失败而静默崩溃。

















