Mac安装JDK全攻略:版本选择、环境变量配置与多版本切换 📅 发布时间:2026/9/8 15:51:28 👁 浏览次数: 第一次在 Mac 上装 JDK 的朋友十有八九会以为这只是“下载、双击、安装”三连就完事。结果你装完打开终端输入java -versionMac 礼貌地甩给你一句无法找到 Java或者压根提示你“需要安装 Java 运行时环境”。更麻烦的情况是Oracle 官网下载页多了一堆看不懂的选项什么 macOS x64、macOS AArch64、JDK 17、JDK 21LTS 和普通版本混在一起还没开始配环境变量人先晕了一半。这篇文章就从我这几年在 Mac 上装 JDK 的实际经历出发把安装前要考虑的事、三种靠谱的安装方式、环境变量配置、多版本切换以及 Maven、IDEA 接不上 JDK 的常见问题一次性说清楚。不管你是刚转 Java 开发的新人还是在 Apple Silicon 机器上折腾老项目的老手照着这个流程走基本能少踩一半的坑。1. 动手之前先想明白你的 Mac 到底需要哪个 JDK装 JDK 之前先别急着点下载有两个前置问题没搞清楚后面大概率会返工一是机器是 Intel 还是 Apple Silicon二是项目需要哪个 Java 版本。这两件事直接决定了你下载哪个安装包、配置时走哪条路。1.1 芯片架构决定你该下载哪个安装包Mac 从 2020 年开始逐步切换到 Apple Silicon 芯片市面上现在至少存在两个大阵营老的 Intel 芯片和新款 M 系列芯片。JDK 是区分架构的你在下载页面见到的 x64 和 AArch64 这两个词就对应这两种 CPU。先打开终端执行一行命令确认自己机器的架构uname -m输出x86_64说明是 Intel Mac官网下载 macOS x64 安装包。输出arm64说明是 Apple Silicon官网下载 macOS AArch64 安装包。我知道你可能会想Apple Silicon 不是可以跑 Intel 版软件吗我偏下载 x64 版本行不行技术上能通过 Rosetta 2 转译运行但没必要。原生 arm64 的 JDK 在性能、内存占用、稳定性上都更好尤其是本地跑大型构建或并发测试时差别是能感知到的。而且有的老版本安装包在 Apple Silicon 上会直接弹出兼容性报错反而给自己找麻烦。还有一个容易出问题的点M 系列机器上如果用了某些需要本地原生库的工具链比如部分 JNI 库x64 JDK 可能会导致加载失败。与其事后折腾不如一开始就选对架构。1.2 版本选型JDK 8、11、17、21 该怎么挑JDK 的版本号这两年让不少人困惑。Java 8 之后Oracle 改变了版本命名方式JDK 8 就是老人口中的 1.8JDK 11、17、21 这些则是后面的长期支持版本。这里的 LTS 全称是 Long-Term Support属于官方会长期维护的版本适合生产环境非 LTS 版本比如 Java 22、23、24 这种隔几个月就更新一次新特性虽然好玩但生态工具不跟上就可能翻车。我的建议很简单新项目优先用 JDK 17 或 21。Spring Boot 3.x、Spring Authorization Server、最新的 MyBatis 这类主流框架都明确支持 17 以上团队协作时也少被人问“你 Java 版本怎么这么老”。老项目继续用 JDK 8别手滑升级。很多历史项目里还跑着老版本的 Tomcat、旧版 Maven 插件升到 17 可能各种兼容性问题井喷。Android 开发或特定构建工具如果对版本有硬性要求就看项目里build.gradle或pom.xml声明的版本缺哪个装哪个。版本选择我见到最多的错误是“哪个新装哪个”。有个朋友图新鲜装了当时最新的非 LTS 版本结果公司内部的代码检查插件不支持Gradle 构建时直接抛异常最后又花了半小时把 JDK 降级到 17。所以安装之前先问清楚项目需要哪个版本再动手。1.3 Oracle JDK、Temurin、Zulu 怎么选很多人只知道 Oracle 官网能下载 JDK其实市面上有多个发行版它们都包含完整的 Java 运行时环境区别主要在授权协议和维护方。发行版维护方适用场景备注Oracle JDKOracle个人本地开发、简单测试官网下载版本更新快Eclipse TemurinAdoptium 社区企业项目、生产环境开源免费最推荐的通用选择Azul ZuluAzul Systems需要老版本 JDK、跨平台支持老 JDK 版本兼容性做得较好Amazon CorrettoAmazonAWS 生态项目AWS 环境下的常见选择如果你是个人学习、写写 demo用 Oracle 官网的 JDK 没有任何问题如果公司有开源合规要求我优先建议 Temurin因为它完全开源免费社区维护也很活跃。老项目非要 JDK 8 的Zulu 通常是比较省心的选择它对旧系统的兼容更新往往更快。注意尽量别从搜索引擎里找那些下载站。官方下载地址无非 Oracle 官网或 Adoptium 官网下载下来的是 dmg 或 tar.gz 文件。到网上随便下载第三方打包好的“JDK 一键安装包”轻则版本被改过重则夹带私货真没必要拿自己电脑的安全性去赌。2. 安装实操三套方案总有一套适合你确认了机器架构、选好了版本接下来就是安装。Mac 上装 JDK 没有标准答案我根据使用场景整理了三条路官网 dmg 安装、Homebrew 命令安装、tar.gz 手动解压。新手走第一条工具党走第二条要精确控制多版本的人走第三条。2.1 方案 A从官网下载安装包适合第一次上手这种方案最直观因为你能看到 JDK 被装到了哪个目录对后续理解环境变量也有帮助。第一步打开 Oracle Java 下载页面oracle.com/java/technologies/downloads/找到你需要的版本。下载时注意看页面上的 macOS 选项Apple Silicon 选 AArch64Intel Mac 选 x64。JDK 8 在 Oracle 官网上会要求你登录账号嫌麻烦的话可以去 Adoptium 或 Zulu 页面下载。第二步双击下载好的 dmg 文件磁盘镜像挂载后会出现一个 pkg 安装包双击它一路点“继续”。安装器会默认把 JDK 放到/Library/Java/JavaVirtualMachines/目录下这个过程不需要你手动改任何东西。第三步安装完成后打开一个新的终端窗口执行java -version能正常输出版本信息就说明装成功了。为什么新开的终端才能生效因为 pkg 安装器写入的是系统级目录当前已经打开的终端进程可能还没刷新如果你在同一个旧窗口里执行偶尔会遇到明明装了却找不到命令的错觉。如果双击 pkg 时弹出“无法打开因为无法验证开发者”之类提示右键点击 pkg选择“打开”系统会多出一个确认弹窗或者去“系统设置 - 隐私与安全性”里找“仍要打开”的按钮。这类提示是 macOS Gatekeeper 的正常拦截只要确认文件下载自官方网站选择打开即可。2.2 方案 BHomebrew 一行命令完成安装日常开发推荐如果你日常用 Mac 做开发大概率已经装了 Homebrew。没装的话去 brew.sh 看官方命令装好后再用下面的方式之后 JDK 的升级卸载都会变得特别省事。先搜一下有哪些 JDK 版本brew search --cask temurin把输出里看到的版本名记一下不同时期可用的 cask 名称可能不一样。常见写法是temurin、temurin17、temurin21这类。然后直接安装brew install --cask temurin17Homebrew 会自动完成下载、校验、安装到/Library/Java/JavaVirtualMachines的全部过程。不用开浏览器、不用找下载链接命令行搞定一切。我实际用下来最舒服的是升级。版本发布后一条命令就能更新brew upgrade --cask temurin17卸载同理brew uninstall --cask temurin17这种方式的另一层价值是可复现。换新电脑时把常用的 cask 清单拿过来批量装比手动下载省太多时间。需要注意Homebrew 有 Intel 和 Apple Silicon 两套安装路径前缀分别是/usr/local和/opt/homebrew。如果你在 M 系列 Mac 上通过 Rosetta 方式装的 Homebrew它默认装的软件也走 x64 路线建议确认一下brew --prefix别让架构问题藏在包管理器后面。2.3 方案 Ctar.gz 手动解压多版本管理的底牌有的场景不适合 dmg也不适合 brew比如你需要在同一个版本号下锁定某个具体 Update 版本例如 17.0.9 而不是最新 17.0.13或者想用免安装的方式临时验证某个 JDK。这时 tar.gz 是最直接的。去 Adoptium 或对应发行版官网下载 tar.gz 包解压后你会得到一个类似jdk-17.0.1311的目录。手动把它放到 JDK 的标准搜索路径下sudo mkdir -p /Library/Java/JavaVirtualMachines sudo mv jdk-17.0.1311 /Library/Java/JavaVirtualMachines/放好之后用下面的命令验证系统能不能发现它/usr/libexec/java_home -V如果列表里出现了新添加的 JDK 路径说明放置成功。这种方式下JDK 其实是“绿色软件”不需要运行安装器只要目录被放到正确位置macOS 就能感知到它。这个方案的典型坑是权限和路径。不放到/Library/Java/JavaVirtualMachines或者放到了用户目录下的奇怪位置java_home可能就扫不到。之前我贪图方便把解压目录放在~/tools/jdk/结果配了好几次环境变量都失败最后才发现系统压根没把它当已安装 JDK。规矩做法还是放到标准目录里一劳永逸。3. 环境变量配置与多版本切换安装完成到这一步新手和老手的处理方式开始分岔。有些教程一上来就让你配 JAVA_HOME另一些说不用配直接就能用。到底要不要配我的结论是java命令能用和整个工具链稳定工作是完全两码事JAVA_HOME 值得配而且要配对。3.1 Java 命令能用为什么还要配置 JAVA_HOMEmacOS 上有个特殊机制即使你还没装任何 JDK系统里也存在一个/usr/bin/java的命令入口。它本质上是一个“中转站”会去调用真正安装的 JDK。所以经常出现一种现象——你安装了 JDK 17 后在终端敲java -version能正常输出版本看起来一切正常但 Maven、Gradle、Tomcat 这类工具启动时却报“找不到 Java”。原因在于很多 Java 工具链不靠 PATH 找 Java而是直接读JAVA_HOME环境变量。没有设置这个变量一些脚本默认去找/usr/lib/jvm或者猜测 Java 安装目录Mac 的目录结构和 Linux 不一样自然就找不到了。所以配置的核心目的不是为了让java命令能用而是让你的整个 Java 开发环境都能稳定定位到 JDK。JDK 9 之后已经不需要配置 CLASSPATH 了常见的配置项就是两个JAVA_HOME指向 JDK 的 Home 目录PATH把$JAVA_HOME/bin加进去。至于MAVEN_HOME、GRADLE_HOME那些属于后续工具链的事这里先不掺和。3.2 给 zsh 写入环境变量的标准姿势先确认你的默认 Shellecho $SHELLmacOS 从 Catalina 开始默认 zsh配置写在~/.zshrc如果你用的还是 bash那配置文件是~/.bash_profile或~/.bashrc。从我个人经验看现在新电脑 99% 都是 zsh所以下面以.zshrc为例。用文本编辑器打开配置文件nano ~/.zshrc在文件末尾添加export JAVA_HOME$(/usr/libexec/java_home) export PATH$JAVA_HOME/bin:$PATH保存退出后执行source ~/.zshrc这里最关键也最容易被忽略的是第一行写法。很多人搜到旧教程会写死成/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home但如果电脑上有多个 JDK或者以后升级了新版本这个写死路径就会被顶掉或者失效。用/usr/libexec/java_home这个系统命令去动态获取当前默认 JDK 路径不管装了几个版本它都能找到正确的那个。如果你想固定使用某个版本可以加-v参数export JAVA_HOME$(/usr/libexec/java_home -v 17) export PATH$JAVA_HOME/bin:$PATH配置完成后执行echo $JAVA_HOME确认输出是你期望的 JDK 路径。如果输出为空要么是没source要么是配置文件里语法有误如果输出了 JDK 8 的路径但你觉得应该指向 JDK 17那就是有多个 JDK 存在系统默认选中的不是你想要的那一个需要回到 3.3 节做版本切换。另外提醒一点别为了省事去改/etc/profile或者全局环境变量文件。macOS 图形界面应用启动时并不读取 shell 配置文件改了全局反而可能在升级系统时出各种奇怪问题。环境变量配置写在自己用户目录下的.zshrc就足够了。3.3 多版本JDK自由切换别名、jenv与SDKMAN同一个开发机上装多个 JDK 是非常常见的场景。日常公司项目用 JDK 8自己练手的新框架需要 JDK 21来回卸载重装绝对是效率灾难。好在这件事在 Mac 上并不难核心思路就是让JAVA_HOME可以随时指向不同版本。先看当前系统里安装了哪些 JDK/usr/libexec/java_home -V输出会列出类似/Library/Java/JavaVirtualMachines/jdk-8.jdk/Contents/Home、/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home这样的路径和对应版本。如果只是偶尔切换我建议在.zshrc里定义几个函数jdk8() { export JAVA_HOME$(/usr/libexec/java_home -v 1.8) export PATH$JAVA_HOME/bin:$PATH java -version } jdk17() { export JAVA_HOME$(/usr/libexec/java_home -v 17) export PATH$JAVA_HOME/bin:$PATH java -version } jdk21() { export JAVA_HOME$(/