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

 更新时间:2026年04月21日 10:04:46   作者: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 等版本的场景。

  • 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 上另有靠前 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两套环境变量隔离在各自环境内单独配置,避免混用路径

免责声明

  • 各工具安装脚本、包名、发行版标识符会随上游更新而变化,以官方文档与仓库 README 为准
  • 文中命令为通用示例,在复制到生产或 CI 前请在目标环境实测。

参考链接:

总结

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

相关文章

  • SpringBoot集成WebSokcet代码步骤

    SpringBoot集成WebSokcet代码步骤

    Spring Boot是一个流行的Java框架,用于快速构建Spring应用程序,WebSocket是一种实现实时通信的协议,与HTTP协议结合使用,可以提供全双工通信,这篇文章主要介绍了SpringBoot集成WebSokcet代码步骤
    2026-01-01
  • SpringBoot开发之整合Mybatis详解

    SpringBoot开发之整合Mybatis详解

    这篇文章主要介绍了SpringBoot开发之整合Mybatis详解,MyBatis是一个半自动的ORM框架,它允许我们通过编写SQL语句来操作数据库,使用MyBatis,我们可以通过定义映射文件(XML文件)或使用注解的方式将Java对象与数据库表进行映射,需要的朋友可以参考下
    2023-09-09
  • JAVA匿名内部类语法分析及实例详解

    JAVA匿名内部类语法分析及实例详解

    这篇文章主要介绍了JAVA匿名内部类语法分析及实例详解,匿名内部类可以使你的代码更加简洁,它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类。对此感兴趣的可以了解一下
    2020-07-07
  • Java concurrency之AtomicLongArray原子类_动力节点Java学院整理

    Java concurrency之AtomicLongArray原子类_动力节点Java学院整理

    这篇文章主要介绍了Java concurrency之AtomicLongArray原子类的相关知识,感兴趣的朋友参考下吧
    2017-06-06
  • java客户端Etcd官方仓库jetcd中KeepAlive接口实现

    java客户端Etcd官方仓库jetcd中KeepAlive接口实现

    这篇文章主要为大家介绍了java客户端Etcd官方仓库jetcd中KeepAlive接口实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,多多加薪
    2022-02-02
  • 一文教会你使用jmap和MAT进行堆内存溢出分析

    一文教会你使用jmap和MAT进行堆内存溢出分析

    本文介绍关于jmap和MAT的使用来进行堆内存溢出分析,因为这个内存溢出是我们手动构造出来的,查找比较简单,真的到了生产上面需要我们仔细排除
    2021-09-09
  • Spring Cloud Alibaba整合Sentinel的实现步骤

    Spring Cloud Alibaba整合Sentinel的实现步骤

    这篇文章主要介绍了Spring Cloud Alibaba整合Sentinel的实现步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java操作Mysql的方法

    Java操作Mysql的方法

    这篇文章主要介绍了Java操作Mysql的方法,实例分析了Java针对有返回结果和没有返回结果的sql操作的相关技巧,需要的朋友可以参考下
    2015-02-02
  • SpringBoot整合RabbitMQ实现六种工作模式的示例

    SpringBoot整合RabbitMQ实现六种工作模式的示例

    这篇文章主要介绍了SpringBoot整合RabbitMQ实现六种工作模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • java反射获取一个object属性值代码解析

    java反射获取一个object属性值代码解析

    这篇文章主要介绍了java反射获取一个object属性值代码解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论