因为export命令只修改当前shell进程的环境变量,新终端是独立进程,不继承旧值;必须将export JAVA_HOME=$(/usr/libexec/java_home -v 17)和export PATH=$JAVA_HOME/bin:$PATH写入~/.zshrc并source生效。

为什么在Zsh里export JAVA_HOME后关掉终端就失效
因为export命令只修改当前 shell 进程的内存变量,新打开的终端是全新进程,完全不继承上一个终端的export结果。这不是 Zsh 特有行为,而是所有 shell 的通用机制。
必须改 ~/.zshrc,而不是 ~/.bash_profile 或 /etc/environment
macOS Catalina(10.15)起默认 shell 是 Zsh,它启动时自动读取~/.zshrc;~/.bash_profile只对 Bash 生效,改了也没用;/etc/environment不支持变量展开(比如不能写$PATH),也不被 Zsh 加载。
- 确认你当前用的是 Zsh:
echo $SHELL输出应为/bin/zsh - 编辑配置文件:
nano ~/.zshrc - 在文件末尾添加两行(推荐用
/usr/libexec/java_home动态获取路径,避免硬编码):export JAVA_HOME=$(/usr/libexec/java_home -v 17) export PATH=$JAVA_HOME/bin:$PATH
- 保存后执行:
source ~/.zshrc
验证是否真·长期生效,别只信 echo $JAVA_HOME
很多人改完就echo $JAVA_HOME看一眼,发现有值就以为成功了——但那只是当前终端缓存的值。真正要验证「长期」,必须开一个**全新终端窗口**(不是source,不是exec zsh),再运行:
-
java -version—— 应输出你期望的 OpenJDK 版本(如 17.0.2) -
echo $JAVA_HOME—— 路径应和/usr/libexec/java_home -v 17输出一致 -
which java—— 应返回$JAVA_HOME/bin/java
如果新开终端后这三项不一致,大概率是其他配置文件(比如~/.zprofile或/etc/zshenv)覆盖了你的设置,得逐个排查。
Homebrew 安装的 OpenJDK 路径容易踩坑
Homebrew 安装的 OpenJDK(如openjdk@17)默认装在/opt/homebrew/opt/openjdk@17(Apple Silicon)或/usr/local/opt/openjdk@17(Intel),但它不是直接可执行的 JDK 目录——真实 JDK 根目录在libexec/openjdk.jdk/Contents/Home下。硬编码这个路径极易出错。
- 正确做法:始终用
/usr/libexec/java_home -v 17获取路径,它会自动定位到正确的Contents/Home - 错误示例:
export JAVA_HOME=/opt/homebrew/opt/openjdk@17→ 后续javac会报tools.jar not found等错 - 如果你需要多个 JDK 版本切换,不要手动改
~/.zshrc,改用jenv这类工具管理,否则极易漏掉source或拼错路径
最常被忽略的一点:GUI 应用(比如 VS Code、IntelliJ IDEA)启动的终端或子进程,默认不加载~/.zshrc,它们可能仍用系统自带 Java。这种场景下,/usr/libexec/java_home仍是唯一可靠的方式,因为它由 macOS 系统级 Java 机制维护,不受 shell 配置影响。


















