Java多版本共存需手动管理JAVA_HOME和PATH或使用SDKMAN!等工具,而非仅安装多个JDK;不同系统路径定位方式不同,切换时须确保$JAVA_HOME/bin在PATH最前,且Maven/IDE配置需与之统一。

Java 多版本共存不是靠“安装多个 JDK 就自动切换”,而是靠手动管理 JAVA_HOME 和 PATH,再配合 Shell 别名或工具(如 SDKMAN!)实现快速切换。Windows 用户尤其容易误以为装完多个 JDK 就能用 java -version 随意切——实际默认只认注册表或首个出现在 PATH 里的 java.exe。
确认已安装的 JDK 路径(Linux/macOS/Windows)
不同系统查路径方式不同,但核心是定位到每个 JDK 的根目录(含 bin、lib 子目录):
- Linux/macOS:常用路径如
/usr/lib/jvm/java-11-openjdk-amd64、/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home、~/sdk/jdk-21.0.1 - Windows:典型路径如
C:\Program Files\Java\jdk-11.0.23、C:\Users\Alice\sdk\zulu-8.78.0.19-ca-jdk8.0.412-win_x64 - 别依赖
which java或where java返回的路径——它只告诉你当前生效的java在哪,不反映所有已安装 JDK 的位置 - 推荐在终端里执行
/usr/libexec/java_home -V(macOS)、update-java-alternatives -l(Ubuntu/Debian)或手动检查C:\Program Files\Java\目录内容
手动切换 JDK:改 JAVA_HOME + 重置 PATH
这是最轻量、无额外依赖的方式,适合 CI 脚本或临时调试。关键点在于:必须让 $JAVA_HOME/bin 排在 PATH 最前面,否则系统可能调用旧版本的 java。
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home" export PATH="$JAVA_HOME/bin:$PATH"
常见错误:
立即学习“Java免费学习笔记(深入)”;
-
PATH拼接时漏了$PATH,导致找不到ls、git等命令 - Windows 的
set JAVA_HOME=...是会话级的,关掉 CMD 就失效;PowerShell 中要用$env:JAVA_HOME="..."; $env:PATH="$env:JAVA_HOME\bin;$env:PATH" - 某些 IDE(如 IntelliJ)启动后会缓存
JAVA_HOME,改完环境变量需重启 IDE 才生效
用 SDKMAN! 管理多 JDK(推荐 macOS/Linux)
SDKMAN! 是专为 JVM 生态设计的版本管理器,比手动改环境变量更可靠,支持一键安装、切换、卸载,且不影响系统全局 Java。
- 安装:
curl -s "https://get.sdkman.io" | bash
,然后重启 shell 或运行source "$HOME/.sdkman/bin/sdkman-init.sh" - 列出可用 JDK:
sdk list java(会显示temurin-17.0.10+7、zulu-8.78.0.19-ca等带厂商和构建号的完整标识) - 安装并设为默认:
sdk install java 17.0.10-temurin && sdk default java 17.0.10-temurin - 为当前 shell 临时切换:
sdk use java 8.0.412-zulu(退出终端即还原) - 注意:
sdk命令本身依赖 Bash/Zsh,Windows 用户需用 WSL 或 Git Bash;PowerShell 原生不支持
Windows 下用 javawrapper 或 pyenv-win?不推荐
Windows 缺乏原生的 shell 版本管理生态,强行套用类 Unix 工具反而增加故障点:
-
javawrapper已多年未维护,对 JDK 17+ 的模块系统支持差,java --list-modules可能报错 -
pyenv-win是为 Python 设计的,硬改来管 Java 容易破坏PYTHONPATH或触发权限问题 - 更稳妥的做法:用 Chocolatey(
choco install openjdk11 openjdk17),再配合 PowerShell 函数封装切换逻辑,或直接在 IDE 里为每个项目指定JDK路径(IntelliJ 的 Project Structure → Project Settings → Project → Project SDK)
真正麻烦的从来不是装多个 JDK,而是构建工具(Maven/Gradle)和 IDE 各自读取不同来源的 Java 版本:Maven 从 MAVEN_OPTS 或 pom.xml 里的 maven-compiler-plugin 读,IDE 可能读 project.settings 或 .idea/misc.xml。一旦出现 “编译用 JDK 17,运行报 UnsupportedClassVersionError”,优先检查这三处是否一致。










