JDK 版本管理工具介绍:jenv与sdkman(Mac端)

目录

    • 一、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 的版本管理工具,没错,jenvsdkman 就是 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或容器化环境中统一管理开发工具。


五、总结与建议

jenvsdkman 代表了两种不同的设计哲学:

  • jenv 遵循 Unix 哲学的"单一职责",专注于做好JDK版本管理这一件事;
  • sdkman 则提供了更为全面的开发工具管理解决方案。

对于小型团队或个人开发者,如果主要工作集中在Java开发且环境相对稳定,jenv的简洁性和轻量性是理想选择。其简单的架构易于理解和维护,不会给开发环境带来额外负担。

对于中大型团队或采用多技术栈的项目,sdkman的综合优势更为明显。它不仅能统一管理JDK,还能协调其他构建工具和JVM语言的版本,提供了一站式的开发环境管理方案。特别是其API接口和自动化功能,能够很好地融入现代DevOps流程。

在实际选型中,建议团队根据自身的技术栈复杂度、团队规模、运维需求和长期发展规划进行综合评估。也可以考虑将两者结合使用:用sdkman管理基础开发工具,用jenv进行精细化的项目级JDK控制,实现优势互补。

整理完毕,完结撒花~🌻

相关推荐
JAVA面经实录91710 小时前
MyBatis学习体系
java·mybatis
java1234_小锋10 小时前
在 Spring AI 中如何实现函数调用(Function Calling)?请说明其基本原理和应用场景。
java·人工智能·spring
小马爱打代码11 小时前
Spring源码 第九篇:Spring 5 源码深度拆解 - Spring 事件驱动模型
java·后端·spring
ForgeAI码匠11 小时前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合
java·spring boot·后端
tongluowan00711 小时前
Redisson的参数及工作原理
java·redis·lua·分布式锁
仙俊红12 小时前
Integer\int对比,equals()\hashcode面试
java·面试·职场和发展
WiChP12 小时前
【V0.1B10】从零开始的2D游戏引擎开发之路
java·数据库·游戏引擎
云烟成雨TD13 小时前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
ForgeAI码匠13 小时前
Maven 多模块项目如何避免越写越乱?Forge Admin 的模块边界实践
java·人工智能·开源·maven
z落落13 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#