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控制,实现优势互补。

整理完毕,完结撒花~🌻

相关推荐
库奇噜啦呼2 小时前
【iOS】 Blocks
macos·ios·cocoa
阿坤带你走近大数据2 小时前
数据API接口的数据源和目标源分别是什么?怎么设置?
java·python·api
若阳安好2 小时前
【java】任务流批处理平台
java·开发语言
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(六):<线程同步与互斥>线程同步(上)
java·linux·运维·服务器·c++·学习·线程
好家伙VCC2 小时前
# BERT在中文文本分类中的实战优化:从基础模型到高效部署BERT(Bi
java·人工智能·python·分类·bert
身如柳絮随风扬2 小时前
什么是缓存预热
java·spring·缓存
Gofarlic_OMS2 小时前
中小企业控制方法:中小型制造企业Creo许可证成本控制
java·大数据·运维·算法·matlab·制造
XiYang-DING2 小时前
【Java】Lambda表达式
java·开发语言·python
隔山打牛牛2 小时前
Spring的两大核心
java·开发语言