JAVA_HOME必须指向JDK根目录(如C:\Program Files\Java\jdk-17.0.1),而非jre或bin子目录;PATH需包含%JAVA_HOME%\bin且置于前端,配置后须重启终端验证。

JAVA_HOME 指向的必须是 JDK 根目录,不是 jre 或 bin
很多初学者把 JAVA_HOME 设成 C:\Program Files\Java\jdk-17.0.1\bin,结果 javac 找不到或 Maven 报错。JDK 安装后,JAVA_HOME 应该指向不含 bin 的顶层路径,比如 C:\Program Files\Java\jdk-17.0.1。
验证方式:在命令行运行 %JAVA_HOME%\bin\java -version(Windows)或 $JAVA_HOME/bin/java -version(Linux/macOS),能正常输出版本才算对。
- 如果提示“不是内部或外部命令”,大概率是
JAVA_HOME多了一层\bin - IDE(如 IntelliJ)启动时读取
JAVA_HOME,设错会导致项目编译器识别失败 - 某些旧版 Tomcat 会严格校验
JAVA_HOME下是否存在lib\tools.jar(JDK 9+ 已移除,但检查逻辑仍在)
PATH 中要添加 %JAVA_HOME%\bin,且必须放在系统 PATH 前段
PATH 是命令查找路径,java 和 javac 都在 %JAVA_HOME%\bin 下。只配 JAVA_HOME 不配 PATH,终端里依然无法直接敲 java -version。
Windows 用户常犯的错是把 %JAVA_HOME%\bin 粘贴到 PATH 最末尾,而前面已有其他 Java(比如 Oracle JRE 自带的 java.exe)。这时执行 java 调用的可能是旧版本甚至 JRE(不带 javac)。
立即学习“Java免费学习笔记(深入)”;
- 建议在 PATH 开头插入
%JAVA_HOME%\bin,避免被覆盖 - 配置完务必重启终端(CMD/PowerShell/IDE 终端),环境变量不会热更新
- 运行
where java(Windows)或which java(macOS/Linux)确认实际调用路径
CLASSPATH 一般不需要手动设置,除非有特殊需求
现代 JDK(8u291+)和构建工具(Maven、Gradle)默认忽略空或未定义的 CLASSPATH。手动加 CLASSPATH=.;%JAVA_HOME%\lib 反而容易引发类加载冲突,比如 java.lang.NoClassDefFoundError。
只有极少数场景才需显式配置:
– 直接运行裸 java MyClass 且依赖 tools.jar(JDK 8)
– 使用老版本 Ant 构建脚本
– 某些嵌入式容器(如旧版 WebLogic 启动脚本)
- 绝大多数情况删掉
CLASSPATH环境变量更安全 - 如果必须设,结尾一定要加
.(当前目录),否则java MyClass会找不到本地 class 文件 - JDK 9+ 的模块系统已弃用
tools.jar,硬塞进CLASSPATH会触发警告甚至失败
多版本共存时,用 SDKMAN! 或 jEnv 管理比手动改环境变量更可靠
手动切换 JAVA_HOME 和 PATH 容易出错,尤其在需要同时开发 Java 8(Spring Boot 2.x)和 Java 17(Spring Boot 3.x)项目时。
Windows 推荐用 SDKMAN!(通过 WSL 运行)或 Chocolatey + Set-JavaVersion;macOS/Linux 直接用 sdk install java 17.0.1-tem + sdk use java 17.0.1-tem,自动更新所有相关变量。
- 每次终端新开都得重新
sdk use?加一行sdk default java 17.0.1-tem到 shell 配置文件即可 - IntelliJ 支持 per-project JDK 设置,但 Terminal 插件仍读取系统
PATH,所以终端内 Java 版本可能和 IDE 不一致 - CI/CD 流水线(如 GitHub Actions)应显式声明
java-version,别依赖全局环境变量
最容易被忽略的一点:环境变量生效范围是进程级的。你在 GUI 应用(如 IDEA)里改了系统变量,不重启应用就看不到效果;WSL 中修改了 /etc/profile,得 source 或新开 shell 才生效。别猜,先 echo %JAVA_HOME% 或 printenv JAVA_HOME 看真实值。











