最稳妥的全局JDK切换方式是update-alternatives(macOS需先brew install homebrew-core/update-alternatives),它不依赖shell配置,对终端、IDE及系统工具均生效;需分别注册java和javac并用--config交互切换,确保java -version与javac -version一致。

用 update-alternatives 管理多 JDK 版本(Linux/macOS)
Linux 和 macOS 上最稳妥的全局 JDK 切换方式是 update-alternatives(macOS 需先装 brew install homebrew-core/update-alternatives)。它不依赖 shell 配置,对所有终端会话、IDE(如 IntelliJ 启动的 Gradle 进程)和系统工具都生效。
常见错误是只改 JAVA_HOME 或 PATH,结果 java -version 和 javac -version 不一致,或 Maven 编译用的却是旧版本 —— 因为 Maven 会绕过 PATH 直接查 update-alternatives 注册的 java 实例。
- 先注册各 JDK:
sudo update-alternatives --install /usr/bin/java java /opt/jdk-8u292/bin/java 100 sudo update-alternatives --install /usr/bin/java java /opt/jdk-17.0.2/bin/java 200 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-8u292/bin/javac 100 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-17.0.2/bin/javac 200
- 交互式切换:
sudo update-alternatives --config java(同理配javac) - 验证是否生效:运行
java -version和javac -version必须输出相同版本号
Windows 下靠 setx + 手动 PATH 调序(非 PowerShell Profile)
Windows 没有等效的 update-alternatives,setx JAVA_HOME 单独改环境变量无效 —— 因为 java.exe 启动器优先从 PATH 中第一个 bin 目录找,根本不用 JAVA_HOME。所以关键在控制 PATH 顺序。
- 把目标 JDK 的
bin路径(如C:\jdk-11.0.20\bin)**手动置顶**到系统环境变量PATH的最前面 - 用命令行验证:
where java应返回该路径;echo %JAVA_HOME%可同步设为对应根目录,但仅作参考 - 避免用 PowerShell 的
$env:PATH=...临时修改 —— IDE(如 Eclipse)启动时读的是系统级PATH,不是当前 shell 的
项目级隔离:Maven/Gradle 自带 JDK 绑定能力
全局切换治标不治本。真正要保障构建一致性,得让构建工具自己选 JDK,和系统设置解耦。
立即学习“Java免费学习笔记(深入)”;
- Maven:在
pom.xml中配maven-compiler-plugin的source/target仅控制字节码级别,**不指定运行时 JDK**;真要锁定 JDK,需用toolchains.xml(放~/.m2/),并启用maven-toolchains-plugin - Gradle:直接在
gradle.properties设org.gradle.java.home=/path/to/jdk-17,比改系统变量更可靠;也可在build.gradle里用javaToolchain { languageVersion = JavaLanguageVersion.of(17) }声明需求,由 Gradle 自动匹配已安装 JDK - 注意:IntelliJ 的 “Project SDK” 和 “Project bytecode version” 是两个独立设置,改 SDK 不自动同步 bytecode 版本,必须手动对齐,否则编译报错
IDE 启动自带 JDK 导致切换失效的坑
IntelliJ、Eclipse 这类 IDE 通常用自己捆绑的 JDK 启动(见 idea.vmoptions 或 eclipse.ini 中的 -vm 参数),所以你系统切了 JDK,IDE 内嵌的终端、Maven 控制台、甚至部分插件仍可能用旧版本。
- 查证方式:在 IDE 终端执行
ps aux | grep java(macOS/Linux)或任务管理器看 java 进程路径 - 修复方法:在 IDE 设置里显式指定 “Shell path” 为
/bin/bash -l(加载完整 profile),或直接在idea.vmoptions中加-Djava.home=/opt/jdk-17.0.2 - VS Code 的 Java 扩展也依赖
java.home设置项,需在settings.json显式写死路径,不能只靠系统变量
真正麻烦的从来不是装多个 JDK,而是每个工具链(shell、IDE、构建器、容器镜像)各自维护一套“当前 JDK”认知。漏掉任意一环,就可能编译成功但运行失败,或者本地 OK 上 CI 就报 UnsupportedClassVersionError。










