如何使用jenv工具管理多个JDK版本
一、jenv到底是干啥的?
简单来说,jenv就是专门用来管理多个Java版本的工具。不管是开发、测试,还是生产环境,只要你需要在同一台机器上用不同的Java版本,它都能帮上大忙。比如说,项目A要求JDK 8,项目B得用JDK 11,有了jenv,就能轻松在这些版本之间切换,再也不用为了版本问题头疼了。
二、jenv的核心功能
(一)管理多个Java版本
- 添加Java版本:想把已经安装好的Java版本添加到jenv里,用这个命令就行:
jenv add /path/to/java/home
比如说你下载了JDK 8和JDK 11,安装路径分别是/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home和/Library/Java/JavaVirtualMachines/jdk11.0.10.jdk/Contents/Home ,添加的时候就这样写:
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk11.0.10.jdk/Contents/Home
- 切换Java版本:切换Java版本也很简单,可以全局切换,也能在局部(当前目录)切换。
jenv global 1.8 # 这就把全局的Java版本切换到JDK 8啦
jenv local 11 # 在当前目录下把Java版本切换成JDK 11
- 查看已安装版本:要是想看看都安装了哪些Java版本,直接用这个命令:
jenv versions
(二)支持插件扩展
jenv支持插件,通过插件能扩展它的功能。像Maven插件可以管理多个Maven版本,Gradle插件能管理多个Gradle版本,还有export插件可以设置环境变量。启用插件的命令也很简单:
jenv enable-plugin maven
jenv enable-plugin gradle
(三)环境隔离
jenv可以给不同的项目或者目录设置不一样的Java版本,这样就能避免全局环境冲突。比如全局想用JDK 11,就在终端输入:
jenv global 11
要是某个项目得用JDK 8,在这个项目的目录下运行:
jenv local 1.8
这时候,当前目录下会生成一个.java-version文件,用来记录这个目录用的Java版本。
(四)自动切换
jenv还有个很贴心的功能,就是自动切换Java版本。当你进入一个包含.java-version文件的目录时,jenv会自动把Java版本切换到文件里指定的版本,是不是很方便?
(五)跨平台支持
不管你用的是macOS、Linux,还是Windows(通过WSL也行),jenv都能在这些系统上使用,适配各种开发环境。
(六)与其他工具集成
jenv能和Maven、Gradle、Spring Boot这些开发工具无缝集成,保证这些工具用的都是正确的Java版本,避免因为版本不一致导致的各种问题。
三、jenv的安装和配置
(一)安装jenv
在macOS上安装jenv超简单,用Homebrew就行:
brew install jenv
(二)初始化jenv
安装好之后,还得把jenv添加到shell配置文件里。如果你用的是zsh,就在~/.zshrc文件里添加这两行:
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
添加完之后,再执行下面这条命令让配置生效:
source ~/.zshrc
要是用bash的话,就把配置添加到~/.bash_profile文件里,操作类似。
四、jenv常用命令汇总
| 命令 | 说明 |
|---|---|
jenv versions | 查看已经安装的Java版本 |
jenv global <version> | 设置全局的Java版本 |
jenv local <version> | 设置当前目录的Java版本 |
jenv shell <version> | 设置当前shell会话的Java版本 |
jenv add /path/to/java/home | 把Java版本添加到jenv |
jenv enable-plugin <plugin> | 启用插件,比如maven、gradle |
jenv doctor | 检查jenv的配置正不正确 |
五、jenv适用场景
- 要是你同时开发好几个项目,每个项目要求的Java版本还不一样,那jenv绝对是你的救星。
- 做不同Java版本兼容性测试的时候,用jenv能快速切换版本,效率直接拉满。
- 担心全局Java版本冲突?用jenv进行环境隔离,完美解决这个问题。
- 想快速切换开发环境?有了jenv,一键切换Java版本。
六、jenv与其他工具对比
| 工具 | 功能 | 特点 |
|---|---|---|
| jenv | 管理Java版本 | 轻量级,还支持插件扩展,用起来很灵活 |
| SDKMAN | 能管理Java、Maven、Gradle等多种工具 | 功能更强大,适合管理多种开发工具的版本 |
| Homebrew | 主要用来安装和管理软件包 | 安装Java挺方便,但没办法进行多版本切换 |
总的来说,jenv在管理Java版本这块表现很出色,简单又好用。要是你还在被Java版本管理的问题困扰,不妨试试jenv!要是在使用过程中有啥问题,欢迎在评论区留言,咱们一起交流解决。
相关文章:
如何使用jenv工具管理多个JDK版本
一、jenv到底是干啥的? 简单来说,jenv就是专门用来管理多个Java版本的工具。不管是开发、测试,还是生产环境,只要你需要在同一台机器上用不同的Java版本,它都能帮上大忙。比如说,项目A要求JDK 8࿰…...
如何彻底解决Docker Desktop中Kubernetes无法启动问题
我们时常会遇到Kubernetes启动提示如下报错信息: {"message":"starting kubernetes: pulling images: pulling from host: pulling tag \"registry.k8s.io/etcd:3.5.16-0\": Error response from daemon: .Log in with your Docker ID or…...
aws(学习笔记第三十四课) dockerized-app with asg-alb
aws(学习笔记第三十四课) dockerized-app with asg-alb 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer 学习内容: 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer在AutoScalingGroup中使用efs以及R…...
嵌入式c学习七
c语言指针:程序需要载入内存中运行,在32bit系统中内存地址的范围是:0x0000 0000-0xFFFF FFFF,内存大小为4GB,内存地址指的是内存单元的编号是固定的,本身就是一个整数,对于32bit系统,…...
Selenium Web UI自动化测试:从入门到实战
引言 在当今快速迭代的软件开发周期中,自动化测试已成为保障产品质量、提升测试效率的核心手段之一。而针对Web应用的UI自动化测试,Selenium作为最流行的开源工具之一,凭借其跨浏览器、多语言支持(Python、Java、C#等)…...
【实战指南】用MongoDB存储文档和图片等大文件(Java实现)
一、前言 在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文…...
Jetpack Compose 显示时间
Jetpack Compose 显示时间 介绍主体代码使用 介绍 在软件中实时显示时间 主体代码 import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStat…...
vue3中,通过获取路由上的token直接进入首页,跳过登录页面
1.需求 A系统想快速进入到B系统,但又不想输入账号密码,A系统的token与B系统共用token,因此在访问B系统就会在路径上携带token(https://magictool-box.com/login?token《token》),通过token直接进入B系统首…...
软考通关利器:中级软件设计师结构化开发核心考点
简介: 作为国家软考中级认证的核心科目,“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点,深度解析需求建模、结构化分析方法(SA/SD)、模块设计原则、数据流图(DFD&#…...
[思考记录]两则:宏观视角、理想化
#宏观视角# 昨天听金老师讲解了他初步整理的大模型宏观概念关系图,受益不少。图上不仅是涵盖了诸多概念,更厉害的应该在于把概念之间的关系进行了描述,更直观展现了概念是如何与其他概念相互作用的。帮助从整体的角度去理解,以及透…...
MySQL 性能优化方向
MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...
3-22 vector的使用详解---STL C++
C中的vector容器展开系统讲解,具体内容如下: 1. vector的定义和特性(基础概念) 讲解vector作为动态数组的核心特性:自动内存管理、动态扩容机制(倍增策略)对比普通数组:支持随机访…...
Collectors.toList / list 转 list
前言 略 Collectors.toList List<User> userList ...; List<Long> userIdList userList.stream().map(User::getUserId).collect(Collectors.toList());...
uniapp 和 webview 之间的通信
1.背景 应用使用了uniapp开发跨端应用,在uniapp中内嵌webview页面实现页面热更新效果,不需要用户单独重新安装软件即可实现页面的版本更新。 2.webview通知uniapp 在开发过程中我们难会遇到需要uniapp和webview来实现数据通信的场景,接下来…...
【Linux】Hadoop-3.4.1的伪分布式集群的初步配置
配置步骤 一、检查环境 JDK # 目前还是 JDK8 最适合 Hadoop java -version echo $JAVA_HOME Hadoop hadoop version echo $HADOOP_HOME 二、配置SSH免密登录 Hadoop需要通过SSH管理节点(即使在伪分布式模式下) sudo apt install openssh-server …...
【Java】深入了解下Java Bitset
【Java】深入了解下Java Bitset 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录 【Java】深入了解下Java Bitset引言如果Java Bitset不是布尔数组,那它是什么…...
Linux CentOS7 安装 ffmpeg教程
官网:FFmpeg 操作 先用uname -a 查看内核版本,如果是 3.2.0或者以上就可以按照此办法来安装 cd /tmp wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz# 2. 解压 tar xvf ffmpeg-release-amd64-static.tar.xz# 3. 将…...
楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用
在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…...
Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)
前言 近期在抠lerobot源码时,看到其封装了ALOHA ACT、diffusion policy、π0时,我就在想,lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事,对他们也是很好的历练然当25年3.18日…...
系统架构设计知识体系总结
1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...
计划管理工具应该具备的能(甘特图)
在当今快节奏的项目管理环境中,高效地规划和跟踪项目进度是至关重要的。甘特图,作为项目管理领域的经典工具,以其直观的时间轴和任务分配方式,深受项目管理者的青睐。 随着数字化时代的到来,甘特图线上编辑器应运而生&…...
简单实用!百度AI + Raphael AI = 免费生图
简单实用!百度AI Raphael AI 免费生图 --  第一步:下载或截取一些好看的图片当参考图片 第二步:用百度AI描述你想要的图片&…...
2 相交链表
1 常规思路 比较两个链表的长度,然后让较短的链表走二者长度之差,此时两个链表就一样长了,开始用双指针遍历,如果有相等返回,没有返回null; 为了减少冗余代码,我们设置一个minCur和maxCur分别…...
2025-03-22 学习记录--C/C++-C 库函数 - getchar()
C 库函数 - getchar() ⭐️ C 标准库 - <stdio.h> (一)、函数声明 🍭 int getchar(void)从标准输入 stdin 获取一个字符(一个无符号字符)。 参数:🎀 NA 返回值:Ἰ…...
APM 仿真遥控指南
地面站开发了一段时间了,由于没有硬件,所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析,显示无人机状态,给无人机发送消息,实现一键起飞,飞往指定地点,降落,返…...
如何防止大语言模型生成有害内容?技术与非技术手段解析
目录 如何防止大语言模型生成有害内容?技术与非技术手段解析 1. 技术手段 方法 1:使用内容过滤(Content Filtering) 方法 2:基于模型的有害内容检测(Toxicity Classification) 方法 3&#…...
BBR 和 CUBIC 对长肥管道的不同反应
有个关于 CUBIC(等一众 AIMD-based cc) 和 BBR 在长肥管道中的行为比较挺有趣,它们的表现竟然截然相反: CUBIC 流共存,RTT 越大,Goodput 越低;BBR 流共存,RTT 越大,Goodput 越高。 前一个被看…...
架构师面试(十九):IM 架构
问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式,消息收发不需要服务端的参与,即客户端之间直连的方式;代理人模式也叫中转模式,消息收发需要服务端进行中转。 下面关于这两类模式描述的…...
Spring框架入门指南:从Hello World到IOC容器
第一章:Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&…...
嵌入式电路设计软件个人安装步骤分享
各位小伙伴大家好,今天给大家分享一个,电路设计软件的安装方法,希望对大家有所帮助。 一、下载【Multisim14.0安装包】: 链接:夸克网盘分享 提取码:kHSP 电脑安装Multisim14.0并且汉化 准备安装包以及汉化包双击“NI_Circuit_Design_Suite_14_0【海量免费资源:kebaiwan…...
