java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java多版本环境管理工具选型与命令速查

Java多版本环境管理工具选型与命令速查方式

作者:REDcker

本文介绍了多JDK并存时的安装来源、版本切换、JAVA_HOME与构建工具对齐方式,以及在Linux、macOS、Windows下的常见选型,介绍了SDKMAN、jEnv、Jabba、Homebrew等工具的使用方法及适用场景,并提供了常见问题及处理方式

多 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跨平台安装、切换 JDKWindows、macOS、Linux原仓库已长期停更,优先关注社区延续仓库(见 Jabba)
Homebrew通过 formula 安装 openjdk@xx 等macOS(及 Linuxbrew)多版本共存常配合 jEnv 或手动 PATH
winget / Scoop / ChocolateyWindows 上安装与升级 JDKWindows与 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_HOMEPATH 优先级。

asdf 与 mise

定位:用统一插件模型管理多语言运行时;适合同一台机器上除 Java 外还要切 Node、Python 等版本的场景。

两者与 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 上另有靠前 javawhich -a java(Unix)或 where java(Windows)排查顺序
IDE 编译版本与终端不一致IDE 使用内置 JRE 或未指向同一 JDK在 IDE 中显式设置 Project SDK / Gradle JVM
Maven 用了「错的」JDKJAVA_HOME 或未使用 Toolchainsmvn -v 查看 Java home;必要时上 Toolchains
jEnv 切换无效未 jenv init 或未启用 export 插件按官方文档检查 shell 钩子等
WSL 与 Windows 各装一套 Java两套环境变量隔离在各自环境内单独配置,避免混用路径

免责声明

参考链接:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文