Mac上JDK多版本共存核心是让java/javac指向所需版本,推荐jenv管理(支持全局/项目级切换),手动alias切换快捷但仅限终端,IDE需单独配置SDK且不读shell别名。

Mac 上配置 JDK 多版本共存,核心不是“能不能装多个”,而是“怎么让 java 和 javac 命令指向你当前需要的那个版本”。手动改 JAVA_HOME 有效但易出错;用 jenv 管理更稳,尤其当你同时维护 Spring Boot 2(需 JDK 8/11)和 Spring Boot 3(强制 JDK 17+)项目时。
确认已安装的 JDK 实际路径
Mac 不会自动把所有 JDK 都加进 PATH,必须先知道它们在哪。Oracle / Temurin 安装包默认放进:/Library/Java/JavaVirtualMachines/;Homebrew 安装的 OpenJDK 则在:/opt/homebrew/Cellar/openjdk@17/17.0.9/libexec/openjdk.jdk/Contents/Home(路径含具体版本号)。
常见错误:执行 ls /Library/Java/JavaVirtualMachines/ 看到目录名是 jdk-17.0.9.jdk,但误写成 jdk-17.jdk —— 路径错一个字符,JAVA_HOME 就失效。
- Intel Mac 用户注意:不要混用 arm64 和 x64 版本,
java -version可能报zsh: killed - M1/M2 用户务必选
arm64构建版,否则 IntelliJ IDEA 编译时可能卡住或提示Unsupported class file major version - Temurin 和 Zulu 的 .pkg 安装后路径结构一致,可直接复用同一套环境变量模板
手动切换:alias + export 是最快捷的临时方案
适合单项目、短时间调试,不依赖额外工具。关键是把 JAVA_HOME 指向正确的 Contents/Home 子目录,并重置 PATH。
在 ~/.zshrc 末尾添加:
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_401.jdk/Contents/Home export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.9.jdk/Contents/Home export JAVA_HOME=$JAVA_17_HOME export PATH=$JAVA_HOME/bin:$PATH alias jdk8='export JAVA_HOME=$JAVA_8_HOME; export PATH=$JAVA_HOME/bin:$PATH' alias jdk17='export JAVA_HOME=$JAVA_17_HOME; export PATH=$JAVA_HOME/bin:$PATH'
执行 source ~/.zshrc 后,终端里输入 jdk8 或 jdk17 即可切换。
- 别漏掉
export PATH=...这行 —— 否则javac找不到命令,只改JAVA_HOME不够 - 别用
sudo改系统级/etc/profile:普通用户无权限,且影响全局,容易被其他脚本覆盖 - IDE(如 IntelliJ)不读 shell 的 alias,它只认
JAVA_HOME当前值或项目级 SDK 设置
jenv 是长期多项目协作的可靠选择
jenv 的本质是用 shims(垫片)劫持 java、javac、mvn 等命令,再按规则转发到对应 JDK。它不碰 JAVA_HOME,也不改 PATH 主链,冲突风险低。
安装与注册流程:
brew install jenv echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(jenv init -)"' >> ~/.zshrc source ~/.zshrc jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_401.jdk/Contents/Home jenv add /Library/Java/JavaVirtualMachines/jdk-17.0.9.jdk/Contents/Home jenv rehash
之后可用:jenv versions 查看已注册版本,jenv global 17.0 设全局默认,jenv local 1.8 在某项目目录下设局部版本。
-
jenv rehash必须每次新增 JDK 后运行,否则java -version仍报 “command not found” -
jenv local会在当前目录生成.java-version文件,Git 提交它可让团队成员开箱即用 - Homebrew 安装的
openjdk@17路径要写全:/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home,不能简写为/opt/homebrew/opt/openjdk@17
IDEA / VS Code 中的 JDK 绑定常被忽略
终端里 java -version 正确 ≠ IDE 编译器用的是同一个 JDK。IntelliJ 默认读取系统 JAVA_HOME,但项目级设置优先级更高。
关键检查点:
- File → Project Structure → Project → Project SDK:必须手动选中已安装的 JDK 目录,不能只靠名称判断
- Maven 导入时若报
Unsupported Java version,检查 Settings → Build → Build Tools → Maven → Runner → JRE:这里独立于项目 SDK,需单独指定 - VS Code 的
Extension Pack for Java依赖java.home设置,该值应填完整路径如/Library/Java/JavaVirtualMachines/jdk-17.0.9.jdk/Contents/Home,不能填$JAVA_HOME
最隐蔽的问题:Gradle wrapper 自带 JVM,gradle --version 显示的 Java 版本可能和终端不一致——它取决于 org.gradle.java.home 配置或 wrapper 自检逻辑,和 shell 环境变量无关。

















