JAVA_HOME必须指向JDK根目录而非bin子目录,例如C:\Program Files\Java\jdk-17.0.1;PATH需包含%JAVA_HOME%\bin且置于前端,配置后须重启终端并依次验证java -version、javac -version和where java/where javac。

JAVA_HOME 必须指向 JDK 根目录,不是 bin 目录
很多人把 JAVA_HOME 设成 C:\Program Files\Java\jdk-17.0.1\bin,结果 java -version 报错或识别不到。这是因为 JAVA_HOME 的作用是让系统知道“整个 JDK 安装在哪”,bin 只是其中的工具子目录。JVM 和构建工具(如 Maven、Gradle)会从 JAVA_HOME 下自动查找 bin、lib、conf 等路径。
正确写法示例:
-
JAVA_HOME值应为:C:\Program Files\Java\jdk-17.0.1(即包含bin文件夹的父目录) - 验证方式:在命令行执行
echo %JAVA_HOME%,输出应不带\bin - 如果用 ZIP 解压版,路径必须是解压后最外层文件夹,比如
E:\Environment\JDK\jdk-17.0.10
Path 中 %JAVA_HOME%\bin 必须置顶,且不能重复添加
Windows 按 Path 中条目的顺序查找命令。若系统里曾装过 JDK8 或 JDK11,旧的 C:\Program Files\Java\jdk1.8.0_291\bin 还留在 Path 里,而新 JDK 的 %JAVA_HOME%\bin 在它后面,那么 java 和 javac 就会优先调用旧版本——这就是为什么 java -version 显示的是 11 而不是 17。
操作要点:
- 编辑
Path时,先检查是否已有其他 JDK 的bin路径,有则删掉 - 新建条目填入
%JAVA_HOME%\bin后,务必用鼠标拖到列表最上方 - 不要手敲完整路径(如
C:\...\jdk-17.0.1\bin),否则JAVA_HOME改了就失效 - 改完后重启所有已打开的 CMD/PowerShell 窗口,否则变量不生效
配置后验证要分步执行,别只跑 java -version
java -version 成功不代表开发环境就 ready。很多 IDE(如 IntelliJ、Eclipse)或构建工具依赖 javac 和 java 的一致性,而某些安装包(尤其是第三方打包版)可能漏掉 javac.exe 或签名异常。
建议按顺序执行这三条命令:
-
java -version—— 确认运行时版本 -
javac -version—— 确认编译器可用且版本匹配(输出应和上一条一致) -
where java和where javac—— 查看实际调用路径,确认两者都来自同一JAVA_HOME下的bin
如果 where 返回两个不同路径,说明 Path 里混进了别的 JDK,得回去清理。
CLASSPATH 已非必需,但老项目可能需要显式设为 .
JDK 11 起,CLASSPATH 默认行为已改为“当前目录 + 模块路径”,绝大多数新项目完全不需要配置。强行加 CLASSPATH 反而容易屏蔽默认类路径,导致 NoClassDefFoundError。
仅当遇到以下情况才考虑添加:
- 维护用 JDK8 编译的老项目,且启动脚本硬编码了
-cp参数 - 使用非常老旧的 Ant 构建脚本,依赖全局 CLASSPATH
- 必须设的话,值应为:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(注意开头的英文点号.)
现代 Spring Boot、Maven 项目完全绕过 CLASSPATH,靠模块系统和 classpath scanning 自动加载,这里多配等于多出一个故障点。

















