近年来java加快了更新的步伐,一个版本用到底的时代也逐渐成为过去时。在实际开发过程中不管是jdk升级还是尝试新技术栈都有可能会遇到需要多jdk版本切换的场景。
一、SDKMAN! 概述
SDKMAN!(Software Development Kit Manager)是一个在 Unix-like 系统上(Linux/macOS/Cygwin/WSL)管理多个并行安装的开发工具版本的工具,常用于管理:
Java(JDK 各个发行版和版本)、Groovy、Scala、Kotlin、Maven、Gradlesbt、ant、leiningen 等
✅ 功能特点:
-
安装/卸载指定版本的 SDK 工具(如 JDK 8、JDK 11、JDK 17)
-
自动设置默认版本
-
快速切换不同版本
-
支持多种开发工具,不限于 Java
二、安装 SDKMAN!
✅ 1. 安装命令(macOS/Linux/WSL):
curl -s "https://get.sdkman.io" | bash
安装完成后,按提示执行:
source "$HOME/.sdkman/bin/sdkman-init.sh"
或者重新开启一个 shell 即可。
✅ 2. 验证安装:
sdk version
三、常用命令详解
✅ 1. 列出可安装的 SDK 类型:
sdk list
常用工具包括:
-
java
-
gradle
-
maven
-
kotlin
-
groovy
-
sbt
-
scala
✅ 2. 安装指定 SDK 类型的版本:
sdk install java 17-tem
支持的 Java 发行版包括:Temurin(Eclipse)、OpenJDK、Oracle、GraalVM等
✅ 3. 查看可用版本:
sdk list java
✅ 4. 设置默认版本:
sdk default java 17-tem
此版本在所有新终端中生效。
✅ 5. 临时使用某个版本(当前 shell):
sdk use java 11.0.20-tem
✅ 6. 卸载 SDK:
sdk uninstall java 17-tem
✅ 7. 显示当前正在使用的版本:
sdk current
📘 SDKMAN! 常用命令速查表
命令 | 示例 | 含义 |
---|---|---|
sdk version |
sdk version |
显示 SDKMAN 当前版本 |
sdk help |
sdk help |
显示帮助信息 |
sdk list |
sdk list |
列出所有可管理的候选工具(如 java、maven) |
sdk list <candidate> |
sdk list java |
显示某个工具的所有版本 |
sdk install <candidate> [version] |
sdk install java 17.0.9-tem |
安装指定版本,若省略版本则安装最新版本 |
sdk uninstall <candidate> <version> |
sdk uninstall java 11.0.20-tem |
卸载某个工具的某个版本 |
sdk use <candidate> <version> |
sdk use java 17.0.9-tem |
临时切换到某个版本(当前 shell 会话) |
sdk default <candidate> <version> |
sdk default java 17.0.9-tem |
设置某个版本为默认(永久生效) |
sdk current [candidate] |
sdk current / sdk current java |
显示当前使用的版本(可选指定工具) |
sdk env init |
sdk env init |
初始化 .sdkmanrc 文件支持功能 |
sdk env |
sdk env |
在有 .sdkmanrc 的目录中启用对应版本 |
sdk env install |
sdk env install |
根据 .sdkmanrc 安装缺失版本 |
sdk upgrade |
sdk upgrade |
检查并升级所有已安装的工具版本(交互式) |
sdk flush archives |
sdk flush archives |
清理下载缓存的安装包 |
sdk flush temp |
sdk flush temp |
清理临时文件 |
sdk flush version |
sdk flush version |
清理版本元数据缓存 |
四、SDKMAN! 工作原理
-
SDKMAN 会在用户主目录下安装软件包(例如
~/.sdkman/candidates/java
) -
切换版本时,会动态修改 PATH 和 JAVA_HOME 等环境变量
-
默认版本通过写入
.sdkmanrc
或$HOME/.sdkman/
目录下进行持久化配置
五、高级用法:添加本地 JDK 到 SDKMAN
SDKMAN 实际上只是通过软链接和目录结构来管理各个工具版本,你可以手动将已有的 JDK 注册为 SDKMAN 可用版本。
📌 步骤如下:
✅ 假设你本地已经安装了 JDK:
/usr/local/java/jdk-17.0.9/
📁 步骤 1:定位 SDKMAN 的 java 目录
cd ~/.sdkman/candidates/java
🏷️ 步骤 2:创建一个版本目录
例如我们想把这个 JDK 注册为 17.0.9-local
版本:
mkdir 17.0.9-local
🔗 步骤 3:软链接到你本地 JDK 安装目录
ln -s /usr/local/java/jdk-17.0.9/* ~/.sdkman/candidates/java/17.0.9-local/
⚠️ 注意:不要将整个 JDK 目录嵌套放进去,而是将内容软链接进去,或直接复制内容。
✅ 步骤 4:验证并使用
sdk use java 17.0.9-local
sdk default java 17.0.9-local
java -version
🔍 示例结构检查
SDKMAN 要求目录下结构如下:
~/.sdkman/candidates/java/17.0.9-local/
├── bin/
│ └── java
├── lib/
├── include/
├── ...
只要你能保证这个结构,SDKMAN 就能正常使用这个版本。
六、实际企业级使用场景
-
CI/CD 环境统一 :通过
.sdkmanrc
保证团队成员使用同一版本,减少版本不一致的问题 -
多项目并行开发:切换 Java 版本或构建工具版本便捷
-
版本测试回归:快速在不同 JDK/Maven/Gradle 版本之间切换做兼容性测试
七、和其他工具对比
工具 | 支持类型 | 特点 |
---|---|---|
SDKMAN! | Java全家桶 | 一站式、简洁、跨工具支持 |
jEnv | Java 版本管理 | 类似 pyenv,专注于 Java |
asdf | 多语言版本管理器 | 插件式,支持 Go、Node 等 |
Homebrew | macOS 包管理 | 安装 Java 支持有限 |