核心是同步更新JAVA_HOME和PATH,仅改JAVA_HOME会导致java -version仍显示旧版本;需用/usr/libexec/java_home -V查版本,再执行export JAVA_HOME=$(/usr/libexec/java_home -v X)和export PATH="$JAVA_HOME/bin:$PATH"完成临时切换,或定义jdk()函数实现一键永久切换。

直接用 /usr/libexec/java_home 切换 JDK 版本,核心是让 JAVA_HOME 和 PATH 同步更新。只改 JAVA_HOME 不碰 PATH,java -version 很可能还是旧版本——这是 macOS 上最常踩的坑。
先查清楚你有哪些 JDK
运行命令列出全部已识别的 JDK(注意是大写 -V,不是小写 -v):
/usr/libexec/java_home -V
输出类似这样:
立即学习“Java免费学习笔记(深入)”;
Matching Java Virtual Machines (3):
21.0.3, x86_64: "OpenJDK 21" /opt/homebrew/Cellar/openjdk@21/21.0.3/libexec/openjdk.jdk/Contents/Home
17.0.12, x86_64: "Temurin-17" /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
11.0.22, x86_64: "GraalVM CE 22.3.0" /Library/Java/JavaVirtualMachines/graalvm-ce-java11-22.3.0/Contents/Home
⚠️ 注意:该命令只显示装在 /Library/Java/JavaVirtualMachines/ 或 Homebrew Cellar 等标准路径下的 JDK;SDKMAN!、手动解压未注册的 JDK 不会出现在这里。
临时切换(当前终端有效)
执行时必须同时更新 JAVA_HOME 和 PATH,否则 java 命令仍调用旧路径:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)export PATH="$JAVA_HOME/bin:$PATH"
验证是否生效:
echo $JAVA_HOMEjava -version
✅ 输出中的厂商标识(如 “Temurin”、“GraalVM CE”)和版本号必须匹配你目标 JDK。
永久切换(推荐用函数,不是 alias)
别名(alias)只改 JAVA_HOME,不重设 PATH,容易失效。更可靠的是定义一个 shell 函数,写入 ~/.zshrc(Zsh 用户)或 ~/.bash_profile(Bash 用户):
jdk() {<br> export JAVA_HOME=$(/usr/libexec/java_home -v "$1")<br> export PATH="$JAVA_HOME/bin:$PATH"<br> java -version<br>}
保存后执行:source ~/.zshrc
之后就可以一行切换:
jdk 11jdk 17jdk 21
函数自动完成路径查找、环境变量设置和即时验证,不遗漏任何环节。
IDE 和构建工具要单独配
终端里切对了 ≠ 全局生效:
-
IntelliJ IDEA:需在 Project Structure → Project SDK 中手动选中对应 JDK 路径,不能依赖
JAVA_HOME。 -
Gradle:优先读取项目根目录下的
gradle.properties中的org.gradle.java.home,或运行时加参数:./gradlew build -Dorg.gradle.java.home=$JAVA_HOME。 -
Maven:支持
MAVEN_OPTS="-Djava.home=$JAVA_HOME",但更稳妥的是在pom.xml中配置maven-compiler-plugin的source和target。
系统级切换只是起点,关键流程得各自确认。



















