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+jQuery实现留言板功能

    基于SpringBoot+jQuery实现留言板功能

    本文详细介绍了基于SpringBoot和jQuery实现留言板功能的全过程,包括需求分析、接口定义、服务器端代码实现、前端页面代码修改以及运行测试,需要的朋友可以参考下
    2025-12-12
  • java中用float时,数字后面加f,这样是为什么你知道吗

    java中用float时,数字后面加f,这样是为什么你知道吗

    这篇文章主要介绍了java用float时,数字后面加f,这样是为什么你知道吗?具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • maven插件spring-boot-starter-tomcat的使用方式

    maven插件spring-boot-starter-tomcat的使用方式

    这篇文章主要介绍了maven插件spring-boot-starter-tomcat的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • JDK8中线程实现的本质与最佳实践指南

    JDK8中线程实现的本质与最佳实践指南

    本文探讨了JDK8中线程实现的唯一本质,并对比了Thread类和Runnable接口的区别,文中指出,在JDK8中,创建线程的本质是实例化Thread类并调用其start()方法,而所谓的“不同方式”只是执行逻辑的不同策略,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • java日期处理工具类

    java日期处理工具类

    这篇文章主要为大家详细介绍了java日期处理工具类,其次还介绍了日期处理的基础知识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • java Timer 定时每天凌晨1点执行任务

    java Timer 定时每天凌晨1点执行任务

    这篇文章主要介绍了java Timer 定时每天凌晨1点执行任务的代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Java 超详细讲解设计模式之原型模式讲解

    Java 超详细讲解设计模式之原型模式讲解

    原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,今天通过本文给大家介绍下Java 原型设计模式,感兴趣的朋友一起看看吧
    2022-03-03
  • Spring MVC参数传递中文乱码解决方法分享

    Spring MVC参数传递中文乱码解决方法分享

    这篇文章主要介绍了Spring MVC参数传递中文乱码解决方法分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • springboot如何通过@Value,@ConfigurationProperties获取配置

    springboot如何通过@Value,@ConfigurationProperties获取配置

    这篇文章主要介绍了springboot如何通过@Value,@ConfigurationProperties获取配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring Security OAuth2集成短信验证码登录以及第三方登录

    Spring Security OAuth2集成短信验证码登录以及第三方登录

    这篇文章主要介绍了Spring Security OAuth2集成短信验证码登录以及第三方登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论