Java多版本环境管理工具选型与命令速查方式
作者:REDcker
多 JDK 并存时的安装来源、版本切换、JAVA_HOME 与构建工具对齐方式,以及 Linux、macOS、Windows 下的常见选型。
问题边界:四类能力
| 能力 | 说明 | 典型载体 |
|---|---|---|
| 获取 JDK 二进制 | 下载安装包或从包索引安装 | 发行方站点、包管理器、sdk install |
| 多版本并存 | 磁盘上同时保留多个 JDK | 上述安装方式的组合 |
| 切换默认 JDK | 改 PATH / JAVA_HOME 或 shell 钩子 | jEnv、Jabba、SDKMAN、手动 |
| 按项目锁定版本 | 进入目录自动或显式选用某版本 | .java-version、.sdkmanrc、Toolchains |
理清需求后再选工具,可避免「装得上但切不动」或「能切但与 IDE/CI 不一致」。
工具总览与适用场景
| 工具/方式 | 主要作用 | 典型平台 | 备注 |
|---|---|---|---|
| SDKMAN | 安装与切换多版本 JDK,并可管理 Maven、Gradle 等 | macOS、Linux;Windows 需 WSL 等 Bash 环境(见官方安装说明) | 个人与团队都常用 |
| jEnv | 管理已安装的多个 JDK,负责切换与 JAVA_HOME 插件 | macOS、Linux 为主 | 不负责下载 JDK |
| Jabba | 跨平台安装、切换 JDK | Windows、macOS、Linux | 原仓库已长期停更,优先关注社区延续仓库(见 Jabba) |
| Homebrew | 通过 formula 安装 openjdk@xx 等 | macOS(及 Linuxbrew) | 多版本共存常配合 jEnv 或手动 PATH |
| winget / Scoop / Chocolatey | Windows 上安装与升级 JDK | Windows | 与 Jabba 或手动配置组合 |
| asdf / mise | 插件式多语言版本管理(含 Java 插件) | 依插件与平台而定 | 适合多语言栈统一用一套命令 |
| 手动 PATH / JAVA_HOME | 完全可控,无额外工具 | 任意 | CI、容器、受限环境常见 |
| Maven Toolchains | 按构建指定 JDK 路径,与 shell 默认 JDK 解耦 | 任意 | 与上游工具链配合 |
选型决策流程

SDKMAN
定位:在 Bash 环境下安装、列出、切换候选版本(含 Java 与常见构建工具)。
安装(摘自官方流程,以 sdkman.io/install 为准):
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk version
常用命令:
sdk list java sdk install java <identifier> sdk use java <identifier> sdk default java <identifier> sdk current java sdk uninstall java <identifier>
Windows:官方以 WSL 或兼容 Bash 的环境为适用前提;生产环境以当前安装页说明为准。
jEnv
定位:在已安装多个 JDK 的前提下,管理使用哪一套(含全局、目录级、当前 shell),并通过插件维护 JAVA_HOME。
安装(macOS 常见):
brew install jenv # 将 jenv 初始化写入 ~/.zshrc 或 ~/.bashrc,例如: # eval "$(jenv init -)"
常用命令(以 jenv 文档 为准):
jenv add /path/to/jdk/home jenv versions jenv global <version> jenv local <version> jenv shell <version> jenv enable-plugin export
说明:jenv add 指向的是 JDK 根目录(内含 bin/java)。启用 export 插件后便于与 IDE、Maven 等读取的 JAVA_HOME 对齐。
Jabba
定位:类「多版本安装器 + 当前 shell 切换」,支持从远端索引拉取 JDK。
维护状态:原 shyiko/jabba 仓库已长期无活跃维护;实际选型请以 GitHub 上社区延续组织 的发布页与安装脚本为准(例如 Jabba-Team 名下仓库),安装命令以前述仓库的 README 为准,勿照抄过期博文中的固定 URL。
概念级用法(具体子命令以所选 fork 文档为准):
列出远端可装版本 → install → use(当前 shell)→ alias default(默认) 项目级:部分实现支持在仓库根写入配置文件以自动选用版本
操作系统包管理与商店
Homebrew(macOS)
brew search openjdk brew install openjdk@17 /usr/libexec/java_home -V
多版本并存时,常用 /usr/libexec/java_home 与 jEnv 组合;或用 brew link --overwrite 调整默认链(注意对系统其他 Java 消费者的影响)。
Windows:winget
winget search OpenJDK winget search Temurin winget install EclipseAdoptium.Temurin.17.JDK
具体 ID 以 winget search 结果为准。
Windows:Scoop / Chocolatey
scoop bucket add java scoop install openjdk17
choco install temurin17jdk
包名与版本号随仓库更新而变化,安装后仍需在「系统/用户环境变量」或 shell 配置中统一 JAVA_HOME 与 PATH 优先级。
asdf 与 mise
定位:用统一插件模型管理多语言运行时;适合同一台机器上除 Java 外还要切 Node、Python 等版本的场景。
- asdf:需安装 asdf-java 插件(或社区替代插件),再
asdf install java ...。 - mise(原 rtx):见 mise 文档,支持声明式
mise.toml/.tool-versions。
两者与 jEnv、SDKMAN 可能叠用,注意同一 shell 会话里谁最后改写 PATH,避免「装了但 java -version 仍指向旧版本」。
手动配置 PATH 与 JAVA_HOME
适用:容器镜像、CI、受限桌面、或仅临时切换。
Linux 示例(Debian/Ubuntu 安装 OpenJDK 17 后推断 JAVA_HOME,勿使用错误嵌套括号):
sudo apt update sudo apt install -y openjdk-17-jdk JAVA_HOME="$(dirname "$(dirname "$(readlink -f "$(command -v java)")")")" echo "$JAVA_HOME" java -version
也可用 java -XshowSettings:properties -version 2>&1 | grep 'java.home' 核对 JVM 报告的 home 路径。
macOS:优先 /usr/libexec/java_home 输出路径,再写入 shell 配置或 CI 变量。
Windows:在「系统属性 → 环境变量」中设置 JAVA_HOME 指向某 JDK 根目录,并把 %JAVA_HOME%\bin 置于 Path 较前位置。
Maven Toolchains
定位:在不依赖 shell 默认 java 的前提下,为 Maven 构建指定 JDK(与不同模块、不同插件需求配合)。
在 ~/.m2/toolchains.xml 中声明多个 jdk 工具链,pom.xml 中通过 maven-toolchains-plugin 等绑定使用。适合「本机默认仍是 JDK 11,但某模块必须用 17」一类场景。细节以 Apache Maven Toolchains 为准。
企业内统一开发环境
部分团队在统一 DevOps 或研发效能平台上集中规定各项目所用 JDK 版本,并与代码仓库、流水线、本地 Agent 或 IDE 配置联动。此类方案侧重流程与合规,与个人电脑上的 jEnv/SDKMAN 互补:前者保证「团队口径一致」,后者保证「本机多项目灵活切换」。
具体能力与操作方式以各组织内部文档为准,本文不展开单一厂商产品名。
常见问题与排查
| 现象 | 可能原因 | 处理方向 |
|---|---|---|
| java -version 与预期不符 | PATH 上另有靠前 java | which -a java(Unix)或 where java(Windows)排查顺序 |
| IDE 编译版本与终端不一致 | IDE 使用内置 JRE 或未指向同一 JDK | 在 IDE 中显式设置 Project SDK / Gradle JVM |
| Maven 用了「错的」JDK | JAVA_HOME 或未使用 Toolchains | mvn -v 查看 Java home;必要时上 Toolchains |
| jEnv 切换无效 | 未 jenv init 或未启用 export 插件 | 按官方文档检查 shell 钩子等 |
| WSL 与 Windows 各装一套 Java | 两套环境变量隔离 | 在各自环境内单独配置,避免混用路径 |
免责声明
- 各工具安装脚本、包名、发行版标识符会随上游更新而变化,以官方文档与仓库 README 为准。
- 文中命令为通用示例,在复制到生产或 CI 前请在目标环境实测。
参考链接:
- SDKMAN! 安装与用法
- jEnv
- Eclipse Temurin(Adoptium)
- Apache Maven Toolchains
- mise
- asdf
- Homebrew
- winget 文档(Microsoft Learn)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
