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 下有两种方式:

  1. WSL 方式(推荐):先安装适用于 Linux 的 Windows 子系统(WSL),再按 Linux 流程安装。
  2. 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

  1. 备份并删除安装目录:

    tar -zcvf ~/sdkman-backup.tar.gz -C ~/ .sdkman
    rm -rf ~/.sdkman
  2. 从 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 defaultsdk use 的区别:

  • default:修改全局配置,新开的 Shell 也生效
  • use:只对当前 Shell 窗口生效,关闭后恢复默认

升级与更新

# 刷新候选工具的版本元数据(不安装,只更新本地可用版本列表)
sdk update

# 查看哪些已安装工具有新版本可升级(会提示并确认是否安装)
sdk upgrade

# 升级指定工具到最新版
sdk upgrade java

# 更新 SDKMAN 自身脚本
sdk selfupdate

# 强制更新(退出 Beta 频道时使用)
sdk selfupdate force

sdk updatesdk upgrade 的区别:

  • update:只刷新远程版本元数据,不安装任何东西,类似 apt update
  • upgrade:实际升级已安装的 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 使用文档