终端执行java -version报“command not found”,根本原因不是JDK未安装,而是shell未将JDK的bin目录加入PATH:需确保JAVA_HOME指向真实JDK路径(用/usr/libexec/java_home -v 21动态获取)、PATH包含$JAVA_HOME/bin且置于开头、配置写入~/.zshrc并执行source ~/.zshrc生效。

为什么终端里敲 java -version 报 command not found?
不是 JDK 没装好,而是 shell 根本没找到 java 命令在哪。Mac 默认不把 JDK 的 bin 目录加进 PATH,就像你家钥匙没放门口——门锁没问题,只是你没拿到钥匙。
关键点有三个:JAVA_HOME 必须指向真实安装路径、PATH 必须包含 $JAVA_HOME/bin、配置文件必须被当前 shell 正确加载。三者缺一不可。
- macOS Catalina(10.15)及之后默认用
zsh,配置文件是~/.zshrc,不是~/.bash_profile -
JAVA_HOME不能硬写死路径(比如/Library/Java/.../jdk-21.jdk/Contents/Home),因为升级或重装后路径会变;要用/usr/libexec/java_home -v 21动态获取 -
export PATH=$JAVA_HOME/bin:$PATH中$JAVA_HOME/bin必须放在$PATH前面,否则系统优先找到系统自带的旧版java(如果有)
怎么确认 JDK 21 真的装好了?
别急着改配置文件。先验证安装本身是否成功:
- 打开终端,运行
/usr/libexec/java_home -V,看输出里有没有类似21.0.8, x86_64: "Java SE 21" /Library/Java/JavaVirtualMachines/jdk-21.0.8.jdk/Contents/Home这样的条目 - 如果没看到,说明安装失败或版本号不匹配——可能是下载了 ARM64 版却装在 Intel Mac 上,或反之
- 如果看到了,复制那一行末尾的完整路径(从
/Library/...开始),备用
注意:java -version 即使能返回结果,也不代表是你刚装的 JDK 21——可能只是系统残留的旧版本。所以一定要用 /usr/libexec/java_home -V 查全量已安装 JDK 列表。
怎么写对 ~/.zshrc 里的两行配置?
编辑 ~/.zshrc,只加这两行,别多别少:
export JAVA_HOME=$(/usr/libexec/java_home -v 21) export PATH=$JAVA_HOME/bin:$PATH
常见错误:
- 漏掉
export关键字,变量不会生效 - 把
$JAVA_HOME/bin写成$JAVA_HOME/jre/bin(JDK 21 不再带独立jre目录) - 用了中文标点或全角空格,导致语法错误
- 保存后没运行
source ~/.zshrc,配置只是“写好了”,没“活过来”
改完记得执行 source ~/.zshrc,然后立刻验证:echo $JAVA_HOME 应该输出路径,which java 应该返回 $JAVA_HOME/bin/java,java -version 和 javac -version 都得显示 21.x.x。
Homebrew 安装 vs 手动安装,选哪个?
如果你只是开发用,推荐 Homebrew 方式,省心且可复现:
-
brew install openjdk@21后,/usr/libexec/java_home -v 21仍能正确返回路径,和 Oracle 官方 JDK 行为一致 - Homebrew 安装的 JDK 默认在
/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk(Apple Silicon)或/usr/local/opt/openjdk@21/libexec/openjdk.jdk(Intel),但你不用管——/usr/libexec/java_home会自动适配 - 手动安装(.dmg)适合需要 Oracle 官方支持、或必须用特定构建(如含 JavaFX 的版本)的场景
无论哪种方式,配置逻辑完全一样:靠 /usr/libexec/java_home -v 21 获取路径,靠 export JAVA_HOME=... 和 export PATH=... 注入环境。路径来源不同,但注入方式不变。
最容易被忽略的是:每次新开终端窗口或标签页,都得确保 ~/.zshrc 被重新读取——如果某次忘了 source,或者误改了其他配置文件(比如 ~/.zprofile),就会回到“找不到命令”的状态。别怀疑 JDK,先 echo $JAVA_HOME 看一眼。

















