sdkman 的安装和常用操作汇总
什么是 SDKMAN
SDKMAN(Software Development Kit Manager)是一款运行在 Unix 系统上的 SDK 版本管理工具,以前称为 GVM(Groovy 环境管理器)。它提供了易用的命令行界面(CLI),可轻松管理多个软件开发工具包的不同版本,灵感来自 apt、pip、RVM、rbenv 等工具。
支持平台:macOS、Linux、Windows(需 WSL 或 Git Bash + MinGW)
支持 Shell:Bash、ZSH
安装 SDKMAN
macOS / Linux 安装
在终端执行以下命令:
curl -s "https://get.sdkman.io" | bash
安装完成后,在当前 Shell 中激活:
source "$HOME/.sdkman/bin/sdkman-init.sh"
验证安装成功:
sdk version
输出示例:
SDKMAN!
script: 5.18.2
native: 0.4.6
Windows 安装
Windows 下有两种方式:
- WSL 方式(推荐):先安装适用于 Linux 的 Windows 子系统(WSL),再按 Linux 流程安装。
- Git Bash 方式:使用 Git Bash 并安装 MinGW 补充工具集,大多数情况可用,存在少量兼容问题。
注意:SDKMAN 需要 bash 环境,不支持原生 Windows CMD / PowerShell,不再支持 Cygwin。
安装到自定义位置
export SDKMAN_DIR="/usr/local/sdkman" && curl -s "https://get.sdkman.io" | bash
CI 环境安装(不修改 Shell 配置)
curl -s "https://get.sdkman.io?rcupdate=false" | bash
卸载 SDKMAN
备份并删除安装目录:
tar -zcvf ~/sdkman-backup.tar.gz -C ~/ .sdkman rm -rf ~/.sdkman从 Shell 配置文件(
~/.bashrc、~/.bash_profile、~/.zshrc)中移除 SDKMAN 初始化代码片段。
管理的 SDK 种类
SDKMAN 不只管理 JDK,支持 30+ 种候选工具,覆盖 JVM 生态的主流开发工具:
| 类别 | 工具 |
|---|---|
| Java 发行版 | Temurin、Corretto、GraalVM、Zulu、Microsoft JDK、Liberica 等 |
| 构建工具 | Maven、Gradle、Ant、SBT |
| JVM 语言 | Groovy、Kotlin、Scala、Clojure |
| 框架 CLI | Spring Boot CLI (spring)、Quarkus (quarkus)、Micronaut (mn) |
| 其他工具 | VisualVM、JMC、Spark 等 |
查看全部支持的候选工具:
sdk list
常用操作命令
查看与搜索
# 列出所有支持的候选工具
sdk list
# 列出某个候选工具的所有可用版本(已安装的在 Status 列标注 installed,当前使用的标注 >>>)
sdk list java
# 查看当前使用的版本
sdk current java
# 查看所有工具的当前版本
sdk current
# 查看某个已安装版本的安装路径
sdk home java 21.0.3-tem
# 查看已安装的所有版本(列出 candidates 目录)
ls ~/.sdkman/candidates/java/
sdk list java 输出示例(节选):
================================================================================
Available Java Versions for macOS ARM 64bit
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Temurin | >>> | 25.0.3 | tem | installed | 25.0.3-tem
| | 21.0.11 | tem | installed | 21.0.11-tem
| | 21.0.3 | tem | | 21.0.3-tem
| | 17.0.11 | tem | | 17.0.11-tem
>>>表示当前正在使用的版本installed表示已下载安装到本地- 空白 Status 表示远程可用、未安装
只查看已安装的版本,SDKMAN 没有专用命令,有两种方式:
# 方式一:直接列出 candidates 目录(最直观)
ls ~/.sdkman/candidates/java/
# 输出示例:21.0.11-tem 25.0.3-tem 8.0.492-zulu current
# 方式二:在完整列表中过滤 installed 行
sdk list java | grep installed
安装与卸载
# 安装默认推荐版本
sdk install java
# 安装指定版本
sdk install java 21.0.3-tem
# 安装 Gradle
sdk install gradle 8.7
# 挂载本地已有的 JDK(不从网络下载,给本地路径起一个别名)
sdk install java 11-local /usr/lib/jvm/java-11-openjdk
# 卸载指定版本
sdk uninstall java 17.0.11-tem
本地版本挂载:当系统已通过其他方式安装了 JDK 时,可用
sdk install java <别名> <本地路径>将其纳入 SDKMAN 管理,之后就能用sdk use/sdk default切换。
切换版本
# 设置全局默认版本(永久生效)
sdk default java 21.0.3-tem
# 仅在当前 Shell 会话中切换(临时)
sdk use java 17.0.11-tem
sdk default和sdk use的区别:
default:修改全局配置,新开的 Shell 也生效use:只对当前 Shell 窗口生效,关闭后恢复默认
升级与更新
# 刷新候选工具的版本元数据(不安装,只更新本地可用版本列表)
sdk update
# 查看哪些已安装工具有新版本可升级(会提示并确认是否安装)
sdk upgrade
# 升级指定工具到最新版
sdk upgrade java
# 更新 SDKMAN 自身脚本
sdk selfupdate
# 强制更新(退出 Beta 频道时使用)
sdk selfupdate force
sdk update与sdk upgrade的区别:
update:只刷新远程版本元数据,不安装任何东西,类似apt updateupgrade:实际升级已安装的 SDK 到最新版,类似apt upgrade,会触发交互确认
离线模式与缓存清理
# 开启离线模式(无网络时使用已安装版本)
sdk offline enable
# 关闭离线模式
sdk offline disable
# 清理所有临时文件、元数据缓存和版本缓存
sdk flush
# 只清理临时下载文件
sdk flush tmp
# 只清理版本元数据缓存
sdk flush metadata
# 只清理版本号缓存文件
sdk flush version
项目级版本锁定(.sdkmanrc)
SDKMAN 支持在项目根目录创建 .sdkmanrc 文件,实现类似 Node.js .nvmrc 的项目级版本锁定。
创建 .sdkmanrc 文件:
手动创建,或使用命令自动生成(基于当前使用版本):
# 在当前目录生成 .sdkmanrc(内容为当前所有已激活版本)
sdk env init
生成的文件示例:
java=25.0.3-tem
maven=3.9.16
也可手动编写,指定所需版本:
java=21.0.3-tem
gradle=8.7
maven=3.9.6
手动加载:
# 切换到 .sdkmanrc 中声明的版本
sdk env
# 安装 .sdkmanrc 中声明的所有版本(若本地未安装则自动下载)
sdk env install
# 清除(恢复到全局默认版本)
sdk env clear
自动切换(推荐):
编辑 ~/.sdkman/etc/config,开启自动加载:
sdkman_auto_env=true
开启后,cd 进入含 .sdkmanrc 的目录时会自动切换版本,离开时自动恢复默认版本。
常用配置(~/.sdkman/etc/config)
| 配置项 | 说明 | 默认值 |
|---|---|---|
sdkman_auto_env |
进入目录自动切换版本 | false |
sdkman_auto_answer |
自动回答 yes(适合 CI) | false |
sdkman_beta_channel |
是否加入 Beta 测试频道 | false |
sdkman_colour_enable |
开启彩色输出 | true |
sdkman_selfupdate_feature |
自动更新 SDKMAN 本身 | true |
常见使用场景
场景一:多 Java 版本共存
# 安装多个版本
sdk install java 8.0.492-zulu
sdk install java 11.0.23-tem
sdk install java 17.0.11-tem
sdk install java 21.0.3-tem
# 查看已安装的所有 Java 版本
ls ~/.sdkman/candidates/java/
# 在完整列表中确认安装状态(Status 列标注 installed,当前使用标注 >>>)
sdk list java
# 查看当前激活的版本
sdk current java
# 全局切换到 Java 21
sdk default java 21.0.3-tem
# 临时在当前终端使用 Java 8(例如运行旧项目)
sdk use java 8.0.492-zulu
场景二:不同项目使用不同版本
项目 A(Java 11 + Gradle 7):
# 在项目 A 根目录
echo "java=11.0.23-tem" > .sdkmanrc
echo "gradle=7.6.4" >> .sdkmanrc
项目 B(Java 21 + Gradle 8):
# 在项目 B 根目录
echo "java=21.0.3-tem" > .sdkmanrc
echo "gradle=8.7" >> .sdkmanrc
开启 sdkman_auto_env=true 后,cd 切换项目目录即自动切换版本。
场景三:安装 Spring Boot CLI
sdk install springboot
spring --version
spring init --dependencies=web,data-jpa my-project
参考资料
- SDKMAN 官网
- SDKMAN 使用文档