brew install openjdk@17 和 brew install openjdk@21 均为 Homebrew 维护的稳定 LTS 版本公式,均支持 Apple Silicon 与 Intel Mac;区别在于版本特性、安全更新周期及项目兼容性——JDK 21 是当前最新 LTS(2023 年发布),JDK 17 是上一版 LTS(2021 年发布),二者均受长期支持,但 JDK 21 包含更多新特性和改进。

brew install openjdk@17 和 brew install openjdk@21 有什么区别
区别不在命令写法,而在 Homebrew 当前维护的公式(formula)是否实际存在、是否为 LTS 版本、以及芯片兼容性。截至 2026 年 10 月,openjdk@17 和 openjdk@21 都是稳定可用的官方公式,且都支持 Apple Silicon(M1/M2/M3)和 Intel Mac。但 openjdk@8 已被 Homebrew 官方归档停更,openjdk@11 虽仍可装,但不再接收安全更新;而 openjdk@22 是非 LTS 版本,不推荐用于生产项目。
关键点:Homebrew 不再提供 openjdk(无版本后缀)这个“最新版”公式——它已被移除。现在必须显式指定 @17 或 @21 才能安装受支持的 LTS 版本。
执行 brew install openjdk@21 后 java -version 还是旧版本
这是最常遇到的问题,本质是 shell 没读到新 JDK 的 bin 目录,或 JAVA_HOME 没生效。不是安装失败,而是路径没刷进去。
-
brew install openjdk@21只负责把 JDK 文件放到/opt/homebrew/Cellar/openjdk@21/21.x.x/,不会自动修改PATH或JAVA_HOME - 必须手动在
~/.zshrc(Apple Silicon)或~/.zshrc(Intel,路径为/usr/local/opt/openjdk@21)里加两行:
export JAVA_HOME=$(/usr/libexec/java_home -v 21) export PATH=$JAVA_HOME/bin:$PATH
注意:/usr/libexec/java_home -v 21 能成功执行的前提是 Homebrew 已将该 JDK 注册进系统 Java 列表。如果报错 “No Java runtime present”,说明注册失败,需补软链接:sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdk
为什么不能用 brew link openjdk@21
Homebrew 明确禁止对 openjdk@xx 执行 brew link,运行会直接报错:Error: Refusing to link macOS-provided software。这不是 bug,而是设计约束——因为 JDK 是系统级运行时,Homebrew 不允许它覆盖或干扰 macOS 自带的 Java 管理机制(如 java_home 工具链)。
替代方案只有两个:
- 用
/usr/libexec/java_home -v 21动态获取路径(推荐,兼容升级) - 硬编码路径,如
export JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home(不推荐,升级版本后要手动改)
另外,别在 ~/.zprofile 和 ~/.zshrc 里重复设置 JAVA_HOME,Zsh 启动时只加载其中一个,冲突会导致值被覆盖。
IntelliJ / VS Code 找不到刚装的 JDK
IDE 启动时继承的是 GUI 登录会话环境,而 ~/.zshrc 只对终端内启动的进程生效。所以即使你在终端里 java -version 正确,IDE 仍可能报 “JDK not found”。
解决方法分两步:
- 确保
JAVA_HOME在登录 shell 级别也可见:把配置移到~/.zprofile(macOS 默认对 GUI 应用加载此文件),内容同上 - 在 IDE 设置中手动指定 JDK 路径:
/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home(Apple Silicon)或/usr/local/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home(Intel)
Gradle 和 Maven 依赖 JAVA_HOME,但它们通常不读 shell 配置——所以 IDE 内嵌终端或构建任务出问题,大概率是这里漏了 ~/.zprofile 同步。


















