跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

在 WSL2 和 Ubuntu 下使用 SDKMAN 管理多版本 Java

在 WSL2 或 Ubuntu 环境中开发 Java 时,常需同时维护多个 JDK 版本。SDKMAN 是管理多版本 SDK 的命令行工具,支持一键安装、切换及项目级版本固定。通过配置 .sdkmanrc 文件,可实现进入目录自动切换对应 Java 版本,避免手动修改 JAVA_HOME 环境变量带来的混乱。相比 update-alternatives 或手动配置,SDKMAN 更适用于多项目并行开发场景,能有效降低构建错误风险,提升开发效率。

人间失格发布于 2026/3/15更新于 2026/6/325 浏览

WSL2 / Ubuntu 下用 SDKMAN 管理多版本 Java

在 WSL2 + Ubuntu 做 Java 后端开发时,经常会遇到这种组合:

  • 老项目还在 Java 8
  • 新项目已经是 Java 17 / 21
  • 同一台机器、同一个终端,需要随时切换 JDK 版本
  • Maven、脚手架脚本、命令行工具都要跟着走

如果你还在来回改 JAVA_HOME,强烈建议上 SDKMAN。


一、SDKMAN 是什么,为什么适合 WSL2?

SDKMAN(Software Development Kit Manager)是 Linux/WSL 下专门用来管理多版本 JDK/SDK 的命令行工具。

它的几个关键特性非常适合日常开发:

  • 同时安装多个 Java 版本(8/11/17/21 随便切)
  • 一行命令切换 JDK,立刻生效
  • 支持「项目级」固定 Java 版本(靠 .sdkmanrc)
  • 不污染系统全局环境变量
  • Maven、Gradle、脚本直接跟随当前 java

对 WSL2 开发者来说,这几乎是目前体验最佳的多 JDK 管理方案。


二、在 Ubuntu / WSL2 安装 SDKMAN(一劳永逸)

在你的 Ubuntu / WSL2 终端中执行(保持网络能访问外网):

curl -s "https://get.sdkman.io" | bash 

安装完成后,加载环境(新开终端也可以):

source "$HOME/.sdkman/bin/sdkman-init.sh"

验证是否安装成功:

sdk version

如果能正常输出版本信息,说明 SDKMAN 已经装好了。


三、用 SDKMAN 安装多个 Java 版本

1. 查看可用 Java 版本
sdk list java

常见推荐(以 Temurin 为例):

  • Java 8:8.0.xxx-tem
  • Java 17:17.0.xxx-tem
2. 安装 Java 8 和 Java 17(示例)
sdk install java 8.0.392-tem
sdk install java 17.0.10-tem

查看本机已安装的版本:

sdk list java | grep installed

到这一步,你的 WSL2 环境里已经有多套 JDK 可以随时切换了。


四、全局切换 Java 版本(当前终端立即生效)

想在当前终端切到 Java 17:

sdk use java 17.0.10-tem

验证一下:

java -version
javac -version

效果是:

  • 当前 shell 立刻使用 Java 17
  • Maven、脚手架、命令行工具都会跟着用这一套 JDK

如果想把某个版本设成「默认版本」(全局默认),可以用:

sdk default java 17.0.10-tem

五、核心功能:项目级 Java 版本固定(强烈推荐)

这一块基本是 SDKMAN 的「杀手级」功能:让每个项目有自己的 Java 版本配置。

1. 进入项目目录
cd ~/project/mom/admin
2. 初始化项目环境
sdk env init

执行后,项目根目录下会生成一个 .sdkmanrc 文件。

3. 编辑 .sdkmanrc
nano .sdkmanrc

写入你想绑定的 JDK 版本,例如:

java=17.0.10-tem

保存退出即可。

4. 启用项目级 Java 版本

在项目目录中执行一次:

sdk env

或者直接开启自动模式(推荐):

sdk config set sdkman_auto_env true

之后的体验就是:

  • 每次 cd 进该项目目录,Java 自动切到 17
  • 离开目录,Java 自动恢复为全局默认版本

多项目并行开发时,这一点可以极大降低「切错 JDK」导致的各种莫名报错。


六、SDKMAN + Maven + 工具的实际效果

在项目目录中执行:

java -version
mvn -v

通常会看到:

  • java 版本就是 .sdkmanrc 中配置的那一套
  • mvn 使用的是同一套 JDK(JAVA_HOME 由 SDKMAN 管理)

此时,让脚本或工具去执行 mvn compile,就不会再遇到类似:

invalid target release: 17

这类因为 JDK 不匹配导致的构建错误,也不需要手动调环境变量、改 IDE 里的 JDK 配置。


七、对比常见几种方案

下面简单对比一下几种常见的多 JDK 管理方式:

方案是否推荐说明
update-alternatives⚠️ 一般只适合全局切换,项目混用不方便
手动改 JAVA_HOME❌ 不推荐容易忘、步骤多、极易出错
SDKMAN(推荐)✅ 强烈推荐支持项目级自动切换,配置干净

在 WSL2 / Ubuntu 环境下,SDKMAN 的易用性和可维护性基本是完胜。


八、实践中的一些小建议(踩坑总结)

结合实际踩坑经验,有几条可以直接遵循:

  • 让「Java 版本随项目走」,不要随系统走
  • 老项目固定在 Java 8,新项目用 Java 17 / 21,可以长期共存
  • 用 SDKMAN 统一管理 JDK,多 Maven 版本的话可以配合 Maven Toolchains 兜底
  • 尽量避免再手动改 JAVA_HOME 等系统环境变量

如果你同时在用:

  • Maven / Gradle
  • Spring Boot / 微服务项目
  • 多个项目并行开发(单体 + 微服务 / 新老系统)
  • 甚至本地脚本、自动化工具

那么「SDKMAN + 项目级 .sdkmanrc」会让环境切换这件事变得非常顺手。


九、最后的一句话总结

在 WSL2 / Ubuntu 下做 Java 开发,SDKMAN 基本可以视为多版本 JDK 管理的「默认解」。

只要把「每个项目都配一份 .sdkmanrc」养成习惯,环境切换这件事基本就从你的日常心智负担里消失了。

目录

  1. WSL2 / Ubuntu 下用 SDKMAN 管理多版本 Java
  2. 一、SDKMAN 是什么,为什么适合 WSL2?
  3. 二、在 Ubuntu / WSL2 安装 SDKMAN(一劳永逸)
  4. 三、用 SDKMAN 安装多个 Java 版本
  5. 1. 查看可用 Java 版本
  6. 2. 安装 Java 8 和 Java 17(示例)
  7. 四、全局切换 Java 版本(当前终端立即生效)
  8. 五、核心功能:项目级 Java 版本固定(强烈推荐)
  9. 1. 进入项目目录
  10. 2. 初始化项目环境
  11. 3. 编辑 .sdkmanrc
  12. 4. 启用项目级 Java 版本
  13. 六、SDKMAN + Maven + 工具的实际效果
  14. 七、对比常见几种方案
  15. 八、实践中的一些小建议(踩坑总结)
  16. 九、最后的一句话总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 时代产品经理成长指南与核心能力模型
  • VR、具身智能与人形机器人:构建现实世界的智能接口
  • Flutter for OpenHarmony:使用 money2 实现高精度金融计算
  • 大模型入门实战指南:环境配置与提示词工程
  • Spring AI 集成 Chroma VectorStore 技术详解与最佳实践
  • 数据结构核心:二叉树概念、性质与堆的实现
  • API 基本概念、功能分类、认证方式、使用方法和开发流程
  • 国内互联网大厂产品经理面试题及参考答案解析
  • RAG 实战:利用 Langchain 和 Milvus 构建本地知识库
  • LLM 高效微调方法详解:Adapter、LoRA、Prompt 等六大主流方案对比
  • JavaScript 获取本周周一零点时间方法
  • AirSim 无人机仿真环境部署与配置指南
  • ComfyUI 提示词助手实战:通过自动化流程提升 AI 绘画效率
  • LangChain 大模型输出结构化解析指南
  • AirSim 无人机仿真实战:起飞与降落控制
  • ComfyUI 云服务器部署实战与优化指南
  • 前端实战:基于 Vue3 实现无限滚动、懒加载与瀑布流模块及优化策略
  • C++ 继承:面向对象代码复用的核心机制
  • 基于 UDP 的手机通话语音局域网传输与 AI 处理 Python 脚本
  • 基于 Semantic Kernel 与 Pandora Box 快速构建 Code Agent

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online