多JDK版本管理方案-SDKMAN

近年来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 支持有限