sdkman 指南
SDKMAN!(Software Development Kit Manager)是一个 Unix-like 系统上的工具,用于安装、管理和切换多种开发工具链版本,例如 Java、Groovy、Scala、Kotlin 等。
本指南介绍如何安装和使用 SDKMAN!,以及常见的配置和故障排除。

SDKMAN!
SDKMAN!(Software Development Kit Manager)是一个开源项目和社区组织,专注于为基于JVM的软件开发工具包提供版本管理。它通过命令行接口简化Java、Groovy、Kotlin、Scala等SDK及构建工具(如Maven、Gradle、SBT)的安装与切换流程,现已成为JVM生态中事实上的标准工具。(SDKMAN!)
关键事实
- 前身:GVM(Groovy enVironment Manager)
- 主要作者:Marco Vermeulen
- 成立时间:约2012年
- 开源许可证:Apache 2.0
- 财政托管:Open Source Collective(通过Open Collective平台)(Open Collective)
起源与发展
SDKMAN! 最初由南非开发者 Marco Vermeulen 创建,用于解决在本地开发环境中频繁切换Grails版本的痛点。其设计灵感来自 RVM 与 rbenv,逐步扩展至整个JVM生态。目前该项目托管于 GitHub,由全球开发者共同维护,拥有活跃的CLI、API与社区插件生态。(GitHub)
功能与架构
SDKMAN! 采用轻量级 Bash 与 Rust 编写,仅依赖 curl、zip 与 unzip。其客户端通过 REST API 与后端通信,实现SDK的安装、切换和移除。平台提供“Broker API”和“Vendor API”,允许厂商自动发布新版本;用户可通过 .sdkmanrc 文件实现项目级SDK固定与自动加载。(SDKMAN!)
社区与资助
该项目完全开源并由社区驱动,接受企业与个人捐助。支持者包括 BellSoft、Info Support、SoftwareMill、Azul 等JVM生态厂商。其资金透明管理于Open Collective上,用于基础设施与兼容性测试等支出。(Open Collective)
当前影响
SDKMAN! 已成为Java及其他JVM语言开发者常用的环境管理工具,被视为JDK分发与版本控制的通用接口,支持在 macOS、Linux 及 Windows Subsystem for Linux 等平台运行,持续推动JVM生态的一致性与可移植性。(Medium)
1. 概述
- 官方网站:https://sdkman.io/
- 支持的命令行:
sdk。 - 通过简单的命令即可在系统中管理多个 SDK 版本,适合开发多语言、多版本的工程场景。
2. 安装
2.1 系统依赖
SDKMAN! 只需要一个支持 curl、unzip 和 zip 的 shell 环境,常见发行版均已具备。
2.2 安装步骤
# 在 bash/zsh/fish 等 shell 中执行以下命令:
curl -s "https://get.sdkman.io" | bash
# 之后重新打开终端或执行:
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 验证安装
sdk version
2.3 升级
sdk selfupdate # 升级 SDKMAN 本身
sdk update # 升级候选 SDK 列表
3. 常用命令
3.1 列出候选
sdk list # 显示所有可安装的候选项及其版本
sdk list java # 查看指定候选项的版本列表
3.2 安装和卸载
sdk install java 17.0.2-zulu # 安装特定版本
sdk uninstall java 8.0.302-zulu # 卸载
3.3 版本切换
sdk use java 11.0.13-zulu # 临时切换当前 shell
sdk default java 1.8.0_292 # 设置全局默认版本
sdk current # 显示当前激活的 SDK 版本
3.4 本地项目配置
在项目根目录创建 .sdkmanrc 文件,指定所需版本:
java=17.0.2-zulu
maven=3.8.6
然后执行:
sdk env # 根据 .sdkmanrc 激活版本
sdk env install # 未安装的候选一并安装
可以将 sdk env 添加到 shell 启动脚本中,实现自动切换。
3.4.1 ⚠️ 常见问题:不会自动切换 JDK
创建了 .sdkmanrc 后,如果进入/离开目录时不自动切换 JDK,通常是 sdkman_auto_env 没有开启。
检查方法:
grep auto_env ~/.sdkman/etc/config
典型无自动切换的状态:
┌────────────────────┬─────────────────────────────────┐
│ 项目 │ 状态 │
├────────────────────┼─────────────────────────────────┤
│ JDK 21 安装 │ ✅ 21.0.9-tem │
├────────────────────┼─────────────────────────────────┤
│ .sdkmanrc 文件 │ ✅ 在项目根目录 java=21.0.9-tem │
├────────────────────┼─────────────────────────────────┤
│ 当前 Java 版本 │ ✅ 21.0.9 │
└────────────────────┴─────────────────────────────────┘
虽然 JDK 和 .sdkmanrc 都正确,但 sdkman_auto_env=false 时,离开/进入项目目录不会自动切换。
解决方法:
# 开启 auto_env
echo "sdkman_auto_env=true" >> ~/.sdkman/etc/config
开启后效果:
- 进入该项目目录 → 自动切 JDK 21
- 离开项目目录 → 恢复全局默认 JDK
3.5 其他辅助命令
sdk offline enable # 离线模式
sdk offline disable # 退出离线模式
sdk platform # 显示当前平台信息
sdk version # SDKMAN 版本
4. 配置
SDKMAN! 的配置文件位于 ~/.sdkman/etc/config。
常见自定义选项:
# 自动回答提示,例如安装多个版本时
sdkman_auto_answer=true
# 下载超时时间(秒)
sdkman_download_timeout=10
# SDK 存储路径
sdkman_candidate_default=http://repo.mycompany.com/sdkman
⚠️ 修改配置后需要重新开启 shell 或
source初始化脚本。
5. 高级使用
- 使用代理:设置
SDKMAN_CANDIDATES_API环境变量指向自定义镜像。 - 集成 CI:在流水线中通过
sdkman_install和sdk use来指定构建环境。 - 扩展插件:可以在
~/.sdkman/candidates目录下手动添加本地 SDK。
6. 故障排查
sdk: command not found:确认~/.sdkman/bin已加入PATH。- 下载失败:检查网络或换用镜像源;可设置
sdkman_force=false。 - 版本列表为空:执行
sdk update刷新元数据。
以上内容覆盖了日常使用 SDKMAN! 所需的主要功能,对开发者管理本地工具集提供便利。如果需要更深入的自定义或遇到问题,可参考官方文档或社区讨论。