macos 多 jdk 开发需用 /usr/libexec/java_home -v 查看已注册版本,再通过 export java_home=$(/usr/libexec/java_home -v x) 临时切换或设别名永久配置,idea 中则在 project sdk 单独指定各项目 jdk。

在 macOS 上同时开发多个 Java 项目时,常遇到项目要求 JDK 8、JDK 17 甚至 JDK 21 并存的情况,手动改环境变量容易漏掉 PATH 同步导致 java -version 显示版本与 JAVA_HOME 不一致,反复验证失败浪费大量调试时间。
查清已装 JDK 版本和路径
打开终端,执行:
/usr/libexec/java_home -V
输出示例中会列出所有已注册的 JDK,包括版本号、厂商名和完整路径。注意:只有通过 .dmg 安装或 Homebrew 正确安装并被系统识别的 JDK 才会出现在这里;手动解压未注册的 JDK 不会显示,也不能用此法切换。
这一步不能跳过——如果列表为空或缺某个版本,说明该 JDK 没被 macOS 的 Java 管理机制收录,后续所有基于 java_home 的切换都会失效。
临时切换(单次终端会话有效)
执行命令即可立即生效:
export JAVA_HOME=$(/usr/libexec/java_home -v 17) && export PATH="$JAVA_HOME/bin:$PATH"
把 17 替换为你要的版本号,例如 1.8、11、21。注意写法必须严格匹配 /usr/libexec/java_home -V 输出中的版本字符串,比如输出是 17.0.2,就写 -v 17 即可匹配;若输出是 1.8.0_345,则必须写 -v 1.8,写 -v 8 会报错。
验证是否成功:
java -version
永久配置并支持一键切换
编辑你的 shell 配置文件(zsh 用户改 ~/.zshrc,bash 用户改 ~/.bash_profile):
nano ~/.zshrc
在文件末尾添加以下三段内容(以 JDK 8、11、17 为例):
alias jdk8='export JAVA_HOME=$(/usr/libexec/java_home -v 1.8); export PATH="$JAVA_HOME/bin:$PATH"; java -version'
alias jdk11='export JAVA_HOME=$(/usr/libexec/java_home -v 11); export PATH="$JAVA_HOME/bin:$PATH"; java -version'
alias jdk17='export JAVA_HOME=$(/usr/libexec/java_home -v 17); export PATH="$JAVA_HOME/bin:$PATH"; java -version'
保存后执行:
source ~/.zshrc
之后在任意新终端中,直接输入 jdk11 就能切换并立刻看到版本反馈。这个方案的关键在于每次 alias 都同时更新 JAVA_HOME 和 PATH,避免了只改 JAVA_HOME 而 PATH 滞后导致的命令错乱问题。
⚠️ 注意:不要用 alias jdk8='export JAVA_HOME=xxx' 这类静态路径写法——它无法适配不同机器路径差异,且一旦 JDK 升级重装路径变更就会失效;必须依赖 /usr/libexec/java_home 动态解析路径。
按项目自动绑定 JDK(IntelliJ IDEA 场景)
第一步:打开 IntelliJ IDEA → Preferences → Build, Execution, Deployment → SDKs
第二步:点击 + 号 → Add JDK → 浏览到 /Library/Java/JavaVirtualMachines/ 下对应版本的 Contents/Home 目录(如 jdk-17.0.2.jdk/Contents/Home)
第三步:回到 Project Structure → Project → Project SDK → 选择刚添加的 JDK 版本
这个设置只影响当前项目,不改动系统环境变量,适合多项目混用不同 JDK 的场景。IDEA 会自动将选定 JDK 的 bin 目录加入该工程的编译与运行时 PATH,无需额外配置。
只要项目 SDK 设置完成,即使终端里 JAVA_HOME 指向 JDK 8,IDEA 内运行的程序仍使用你指定的 JDK 17,互不干扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











