确认 Java 实际路径需用 which/java -XshowSettings:properties 查 java.home;JAVA_HOME 必须指向 JDK 根目录而非 bin 子目录;Windows 用 %JAVA_HOME%\bin 加入 PATH,macOS/Linux 按 shell 类型配置 ~/.zshrc 或 ~/.bash_profile,并 source 生效;IDE 需手动配置 SDK 路径。

Java 命令行能运行,说明 JAVA_HOME 和 PATH 配置基本正确;但经常出问题的不是“能不能”,而是“用的是哪个 Java”——尤其当你装了多个 JDK 版本时。
怎么确认当前 java 命令到底指向哪个 JDK
别只信 java -version 输出的版本号,它可能被 PATH 里靠前的旧版本劫持。真正可靠的方式是:
- 运行
which java(macOS/Linux)或where java(Windows CMD),看路径是否落在你期望的 JDK 目录下(比如/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java或C:\Program Files\Java\jdk-21\bin\java.exe) - 再执行
java -XshowSettings:properties -version 2>&1 | grep "java.home"(Linux/macOS)或java -XshowSettings:properties -version 2>&1 | findstr "java.home"(Windows),它会输出 JVM 实际加载的java.home,这才是真实生效的根目录
JAVA_HOME 必须指向 JDK 根目录,不能是 bin 子目录
常见错误是把 JAVA_HOME 设成 C:\Program Files\Java\jdk-21\bin 或 /usr/lib/jvm/java-17-openjdk-amd64/bin——这会导致 Maven、Gradle、IDE 等工具找不到 javac 或 tools.jar(虽然新 JDK 已移除该 jar,但工具链仍依赖标准结构)。
- 正确值示例:
C:\Program Files\Java\jdk-21(Windows)、/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home(macOS)、/usr/lib/jvm/java-17-openjdk-amd64(Ubuntu) -
JAVA_HOME本身不参与命令查找,但它会被其他工具读取并拼接出$JAVA_HOME/bin;所以你必须确保$JAVA_HOME/bin下存在java、javac等可执行文件 - 某些 Linux 发行版(如 Ubuntu)自带
update-alternatives,它可能覆盖你的PATH设置——此时即使JAVA_HOME正确,java命令也可能来自软链接而非你设的路径
Windows 下 PATH 添加方式:优先用 %JAVA_HOME%\bin,别硬编码路径
直接往 PATH 里写死 C:\Program Files\Java\jdk-21\bin 看似简单,但换 JDK 就得手动改 PATH,还容易因空格或反斜杠引发问题(CMD 对路径中空格敏感,且不推荐用 \ 而应统一用 / 或双引号包裹)。
立即学习“Java免费学习笔记(深入)”;
- 先在系统变量里定义
JAVA_HOME(如上所述) - 再在
PATH开头添加%JAVA_HOME%\bin(注意:是%JAVA_HOME%\bin,不是%JAVA_HOME%/bin,Windows 只认%包裹 +\) - 重启所有已打开的终端窗口——CMD/PowerShell 不会自动继承新环境变量
- 验证顺序:打开新 CMD,运行
echo %PATH%,确认%JAVA_HOME%\bin出现在最前面(或至少比旧 JDK 的bin靠前)
macOS/Linux 的 shell 配置文件选哪个:别混用 ~/.bash_profile 和 ~/.zshrc
macOS Catalina 之后默认 shell 是 zsh,但很多人还在 ~/.bash_profile 里配 JAVA_HOME 和 PATH,结果新开 Terminal 没生效。
- 检查当前 shell:
echo $SHELL,如果是/bin/zsh,就该改~/.zshrc;如果是/bin/bash,才改~/.bash_profile - 配置内容统一用:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)(macOS 自带命令,自动定位指定版本 JDK)或手动写死路径;再加export PATH=$JAVA_HOME/bin:$PATH - 改完别忘了
source ~/.zshrc(或对应文件),否则不会立即生效 - 如果用了 Oh My Zsh 或其他框架,确认没在插件或主题里覆盖了
PATH
最常被忽略的一点:IDE(如 IntelliJ)启动时可能不读 shell 配置,而是用自己的环境变量设置——所以命令行能跑 javac,IDE 里却报“Cannot resolve symbol”或“JDK not configured”,这时候要进 IDE 的 Project Structure → SDKs 里手动指定 JDK 路径,而不是指望它自动读 JAVA_HOME。










