java和javac版本不一致说明jdk安装不完整或环境配置错误;需通过which、/usr/libexec/java_home -v检查路径与已注册jdk,确保java、javac、java_home三者版本统一且path包含$java_home/bin。

java -version 和 javac -version 输出不一致
这是 Mac 上最典型的“看似装了,其实没装全”信号。比如 java -version 显示 17.0.1,而 javac -version 报错或显示另一个版本(如 11),说明系统里混着多个 JDK,或者当前 javac 指向的是 JRE 而非 JDK。
-
javac不是运行时工具,它只存在于完整 JDK 中;JRE 或 macOS 自带的/usr/bin/java不含javac - 执行
which java和which javac,路径不一致就铁定有问题 - 用
/usr/libexec/java_home -V查所有已注册 JDK,确认你期望的版本是否在列表里 - 如果没出现,说明安装包没被系统识别——双击 .dmg 安装后,必须重启终端,且不能跳过授权步骤
echo $JAVA_HOME 返回空或路径错误
Mac 默认不设 JAVA_HOME,即使 java 和 javac 都能跑,IDE 或构建工具(如 Maven、Gradle)仍可能失败。这不是“可有可无”的配置项,而是实际开发中的刚需。
- 别手动硬编码路径,比如写成
/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home—— 这个路径随版本升级会变 - 正确做法是用
/usr/libexec/java_home -v 21(替换为你想用的版本号)动态获取路径,再赋值给JAVA_HOME - 如果你用的是 zsh(macOS Catalina 及以后默认),改的是
~/.zshrc,不是~/.bash_profile;改完必须执行source ~/.zshrc - 验证:新开一个终端,直接输
echo $JAVA_HOME,输出应为类似/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
三条命令缺一不可:java、javac、JAVA_HOME
单独看任一命令都可能“蒙混过关”。比如系统自带 Java 会让 java -version 成功,但你根本没法编译代码;又或者 JAVA_HOME 设对了,但 PATH 没加 $JAVA_HOME/bin,导致命令行找不到 javac。
- 必须同时满足:
java -version有输出、javac -version有输出、echo $JAVA_HOME返回非空且合法路径 - 三者版本号要一致,否则 Maven 编译会报
Unsupported class file major version - VS Code 或 IntelliJ 启动终端时不会自动加载 shell 配置文件,需关闭重开终端,或在设置里勾选 “Run login shell”
- 某些 IDE(如 VS Code 的 Java Extension Pack)还会读取
java.home设置,和系统环境变量脱钩——得单独配
Mac 安装后为什么还要手动配?
因为 Apple 从 macOS 10.15 开始移除了系统级 Java,现在所有 JDK 都是第三方安装,macOS 不再自动注册 JAVA_HOME 或更新 PATH。哪怕你用 .dmg 安装成功,也只把 JDK 放进 /Library/Java/JavaVirtualMachines/,不等于“可用”。
- .dmg 安装器不会修改你的 shell 配置文件,也不会帮你写入 PATH —— 这是设计使然,不是 bug
-
/usr/libexec/java_home是 macOS 提供的“代理”,它本身不启动 Java,只是帮你查路径;你不调用它,它就不会生效 - M1/M2/M3 芯片用户尤其要注意:Arm 版 JDK 必须下载 arm64 包,x64 包靠 Rosetta 运行,
javac可能卡死或编译失败 - 验证时别只在一个终端窗口试——关掉再开,避免缓存干扰











