目录
-
- 一、jenv详解
-
- [1.1 核心架构](#1.1 核心架构)
- [1.2 安装与配置](#1.2 安装与配置)
- [1.3 添加本地 JDK](#1.3 添加本地 JDK)
- [1.4 jenv常用命令](#1.4 jenv常用命令)
- 二、sdkman详解
-
- [2.1 核心架构](#2.1 核心架构)
- [2.2 安装与配置](#2.2 安装与配置)
- [2.3 版本管理](#2.3 版本管理)
- [2.4 高级功能](#2.4 高级功能)
- 三、功能对比
- 四、使用场景分析
-
- [4.1 适用jenv的场景](#4.1 适用jenv的场景)
- [4.2 适用sdkman的场景](#4.2 适用sdkman的场景)
- 五、总结与建议

引言:
开发过前端 Vue 的同学应该都了解,Vue 有一个 nvm 的版本管理工具,没错,jenv 和 sdkman 就是 Java 的版本管理工具。在Java开发中,开发人员经常需要在不同项目中使用不同版本的JDK,其中jenv和sdkman是两个极具代表性的解决方案。
一、jenv详解
1.1 核心架构
jenv 是一个轻量级的JDK版本管理工具,其设计哲学是"简单即美"。它通过修改系统的 PATH 环境变量和 JAVA_HOME 变量来实现 JDK 版本的切换。
jenv 的核心组件包括:
1)版本注册器:负责将系统中安装的JDK版本注册到jenv的管理列表中
2)环境变量管理器:动态修改JAVA_HOME和PATH变量,确保正确的JDK版本被调用
3)Shell插件:为bash、zsh等shell提供自动版本切换功能
1.2 安装与配置
jenv的安装过程极为简洁,通常通过包管理器即可完成:
bash
# macOS系统
brew install jenv
# Linux系统
git clone https://github.com/jenv/jenv.git ~/.jenv
安装完成后,需要在shell配置文件中添加初始化代码:
- 首先,查看当前命令是bash还是zsh:
shell
echo $SHELL
- 如果是 zsh 命令:(Mac默认)
bash
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
source ~/.zshrc
- 如果是 bash 命令:
shell
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(jenv init -)"' >> ~/.bashrc
source ~/.bashrc
查看 PATH 中所有路径,确认 ~/.jenv/shims 是否在 PATH 最前面:
shell
echo $PATH | tr ':' '\n'

执行如下命令,检查 jenv 是否正确安装完毕:
shell
jenv doctor
结果如下则说明安装成功。

1.3 添加本地 JDK
使用jenv add指令将本地已安装的JDK添加到jenv管理中。
比如本人电脑上有jdk1.8和jdk17。
磁盘位置示例:
- jdk8:/Users/XXX/my/java/jdk1.8.0_202.jdk/Contents/Home
- jdk17:/Users/XXX/my/java/jdk-17.0.16.jdk/Contents/Home
执行add指令:
shell
jenv add /Users/XXX/my/java/jdk1.8.0_202.jdk/Contents/Home
jenv add /Users/XXX/my/java/jdk-17.0.16.jdk/Contents/Home
通过 jenv 查看jdk版本列表:
bash
jenv versions

使用 jenv 切换到 JDK1.8:
bash
jenv global 1.8
# 或
jenv local 1.8
查看当前 jenv 版本:
shell
jenv global
# 或
jenv local

可以看到JDK版本已经切换成功。
1.4 jenv常用命令
| 命令 | 说明 | 示例 |
|---|---|---|
jenv version |
查看当前使用的JDK版本 | jenv version |
jenv versions |
查看所有已管理的JDK版本 | jenv versions |
jenv add <path> |
添加本地JDK到jenv管理 | jenv add /path/to/jdk |
jenv remove <version> |
从jenv管理中移除指定版本 | jenv remove 1.8 |
jenv global <version> |
设置全局JDK版本 | jenv global 17 |
jenv local <version> |
设置当前目录的JDK版本 | jenv local 11 |
jenv shell <version> |
设置当前shell会话的JDK版本 | jenv shell 8 |
jenv which java |
查看当前使用的java路径 | jenv which java |
jenv doctor |
检查jenv配置和状态 | jenv doctor |
二、sdkman详解
2.1 核心架构
sdkman(Software Development Kit Manager) 是一个功能更为全面的开发工具包管理器,不仅支持JDK,还支持Groovy、Scala、Kotlin、Gradle、Maven等多种开发工具。其架构特点包括:
1)统一管理平台:所有开发工具的安装、更新、切换都在同一框架下完成
2)版本仓库:维护一个中心化的版本索引,包含各工具的稳定版本和预览版本
3)自动依赖解析:安装JDK时自动处理相关依赖
4)多用户支持:支持系统级安装和用户级安装
2.2 安装与配置
sdkman的安装通过curl命令一键完成:
- 首先,查看当前命令是bash还是zsh:
shell
echo $SHELL
- 如果是 zsh 命令:(Mac默认)
shell
curl -L -s "https://get.sdkman.io" | zsh
- 如果是 bash 命令:
bash
curl -L -s "https://get.sdkman.io" | bash

安装脚本会自动配置环境变量,并在shell启动时加载sdkman:
bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
2.3 版本管理
sdkman提供了一套完整的版本管理命令:
1)列出可用版本:
bash
sdk list java

2)安装特定版本:
bash
sdk install java 17.0.12-oracle

3)切换默认版本:
bash
sdk default java 17.0.3-tem

4)临时切换版本:
bash
sdk use java 8.0.302-open

5)卸载版本:
bash
sdk uninstall java 17.0.12-oracle

2.4 高级功能
sdkman相较于jenv提供了更多企业级功能:
1)版本别名 :为常用版本设置别名,如sdk alias default java 17.0.3-tem
2)自动更新:定期检查新版本并提示更新
3)离线模式:在网络受限环境下使用已下载的版本
4)API接口:提供REST API供自动化脚本调用
三、功能对比
| 特性 | jenv | sdkman |
| 专注领域 | 仅JDK管理 | 多SDK管理 |
| 安装复杂度 | 简单 | 中等 |
| 配置文件 | .java-version | .sdkmanrc |
| 跨平台支持 | macOS/Linux | macOS/Linux/WSL |
| 版本源 | 本地安装的JDK | 远程仓库+本地 |
| 自动切换 | 目录级 | 目录级+项目级 |
| 插件生态 | 有限 | 丰富 |
| 企业功能 | 基础 | 高级(别名、更新、API) |
| 社区活跃度 | 中等 | 高 |
| 文档完整性 | 基础 | 完整 |
四、使用场景分析
4.1 适用jenv的场景
1)轻量级需求:团队只需要管理JDK版本,不需要其他开发工具的统一管理。
2)性能敏感:对shell启动速度有严格要求,jenv的轻量设计影响更小。
3)简单架构:项目技术栈单一,JDK版本变化不频繁。
4)安全要求高:需要完全控制版本源,避免从远程仓库下载
4.2 适用sdkman的场景
1)多技术栈:团队同时使用Java、Kotlin、Scala等多种JVM语言。
2)DevOps集成:需要与CI/CD流水线集成,利用API进行自动化管理。
3)快速迭代:项目需要频繁切换和测试不同版本的JDK。
4)新团队入职:通过标准化的安装脚本快速配置开发环境。
5)云开发环境:在云IDE或容器化环境中统一管理开发工具。
五、总结与建议
jenv 和 sdkman 代表了两种不同的设计哲学:
- jenv 遵循 Unix 哲学的"单一职责",专注于做好JDK版本管理这一件事;
- sdkman 则提供了更为全面的开发工具管理解决方案。
对于小型团队或个人开发者,如果主要工作集中在Java开发且环境相对稳定,jenv的简洁性和轻量性是理想选择。其简单的架构易于理解和维护,不会给开发环境带来额外负担。
对于中大型团队或采用多技术栈的项目,sdkman的综合优势更为明显。它不仅能统一管理JDK,还能协调其他构建工具和JVM语言的版本,提供了一站式的开发环境管理方案。特别是其API接口和自动化功能,能够很好地融入现代DevOps流程。
在实际选型中,建议团队根据自身的技术栈复杂度、团队规模、运维需求和长期发展规划进行综合评估。也可以考虑将两者结合使用:用sdkman管理基础开发工具,用jenv进行精细化的项目级JDK控制,实现优势互补。
整理完毕,完结撒花~🌻