使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程
1. 前言
在現(xiàn)代 Java 開發(fā)中,我們經(jīng)常需要在不同的項(xiàng)目中使用不同版本的 JDK。比如:
- 老項(xiàng)目需要使用 JDK 8
- 新項(xiàng)目可能使用 JDK 11 或 JDK 17
- 某些特定框架對(duì) JDK 版本有嚴(yán)格要求
手動(dòng)切換 JAVA_HOME 環(huán)境變量既繁瑣又容易出錯(cuò)。Jenv 是一個(gè)優(yōu)秀的 JDK 版本管理工具,可以讓我們輕松地在不同 JDK 版本間切換。
2. 什么是 Jenv
Jenv 是一個(gè)命令行工具,用于管理多個(gè) Java 版本。它類似于 Node.js 的 nvm 或 Ruby 的 rbenv,可以:
- 全局設(shè)置默認(rèn) JDK 版本
- 為特定 shell 會(huì)話設(shè)置 JDK 版本
- 為特定項(xiàng)目目錄設(shè)置 JDK 版本
官方 GitHub 地址:https://github.com/jenv/jenv
3. 安裝 Jenv
3.1 使用 Homebrew 安裝
brew install jenv
3.2 配置 Shell 環(huán)境
安裝完成后需要配置你的 shell 環(huán)境:
對(duì)于 Zsh 用戶:
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(jenv init -)"' >> ~/.zshrc source ~/.zshrc
對(duì)于 Bash 用戶:
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(jenv init -)"' >> ~/.bash_profile source ~/.bash_profile
4. 驗(yàn)證安裝
安裝完成后,可以運(yùn)行以下命令檢查 jenv 狀態(tài):
jenv doctor
初次安裝可能會(huì)看到一些錯(cuò)誤信息,這是正常的,我們接下來會(huì)逐步配置:
[OK] No JAVA_HOME set [ERROR] Java binary in path is not in the jenv shims. [ERROR] Please check your path, or try using /path/to/java/home is not a valid path to java installation.
5. 查看系統(tǒng)中的 JDK 安裝
在添加 JDK 到 jenv 之前,我們需要知道系統(tǒng)中都安裝了哪些版本的 JDK:
/usr/libexec/java_home -V
這個(gè)命令會(huì)列出所有已安裝的 JDK 版本及其安裝路徑:

6. 添加 JDK 版本到 Jenv
6.1 添加單個(gè) JDK 版本
使用 jenv add 命令添加 JDK 版本:
# 語(yǔ)法:jenv add {JDK安裝目錄}
jenv add /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
添加成功后會(huì)顯示:
zulu64-17.0.15 added 17.0.15 added 17.0 added 17 added
6.2 批量添加多個(gè) JDK 版本
你可以逐個(gè)添加所有已安裝的 JDK 版本:
# 添加 JDK 8 jenv add /Library/Java/JavaVirtualMachines/zulu8.jdk/Contents/Home # 添加 JDK 11 jenv add /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home # 添加 JDK 17 jenv add /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
7. Jenv 基本使用
7.1 查看已管理的 JDK 版本
jenv versions
輸出示例(帶 * 號(hào)的是當(dāng)前使用的版本):
* system (set by /Users/username/.jenv/version) 1.8 1.8.0.452 11 11.0 11.0.26 17 17.0 17.0.15 oracle64-11.0.26 zulu64-1.8.0.452 zulu64-17.0.15
7.2 設(shè)置全局默認(rèn) JDK 版本
# 設(shè)置 JDK 17 為全局默認(rèn)版本 jenv global 17 # 驗(yàn)證 java -version
輸出:
openjdk version "17.0.15" 2025-04-15 LTS OpenJDK Runtime Environment Zulu17.58+21-CA (build 17.0.15+6-LTS) OpenJDK 64-Bit Server VM Zulu17.58+21-CA (build 17.0.15+6-LTS, mixed mode, sharing)
7.3 設(shè)置當(dāng)前 Shell 會(huì)話的 JDK 版本
# 在當(dāng)前 shell 會(huì)話中臨時(shí)使用 JDK 8 jenv shell 1.8 # 驗(yàn)證 java -version
輸出:
openjdk version "1.8.0_452" OpenJDK Runtime Environment (Zulu 8.86.0.25-CA-macos-aarch64) (build 1.8.0_452-b09) OpenJDK 64-Bit Server VM (Zulu 8.86.0.25-CA-macos-aarch64) (build 25.452-b09, mixed mode)
7.4 設(shè)置項(xiàng)目目錄的 JDK 版本
# 進(jìn)入項(xiàng)目目錄 cd /path/to/your/project # 設(shè)置該項(xiàng)目使用 JDK 11 jenv local 11 # 驗(yàn)證 java -version
這會(huì)在項(xiàng)目根目錄下創(chuàng)建一個(gè) .java-version 文件,每次進(jìn)入該目錄時(shí)會(huì)自動(dòng)切換到指定的 JDK 版本。
8. 解決 JAVA_HOME 沖突問題
8.1 常見問題
如果你發(fā)現(xiàn)切換 JDK 版本后 java -version 沒有變化,很可能是因?yàn)橹笆謩?dòng)設(shè)置的 JAVA_HOME 環(huán)境變量覆蓋了 jenv 的設(shè)置。
8.2 解決方案
8.2.1 注釋掉手動(dòng)的 JAVA_HOME 設(shè)置
編輯你的 shell 配置文件(如 ~/.zshrc),注釋掉之前的 JAVA_HOME 設(shè)置:
# JDK Config (注釋掉,改用jenv管理) # JAVA_HOME_11=/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home # JAVA_HOME_8=/Users/username/Library/Java/JavaVirtualMachines/azul-1.8.0_452/Contents/Home # JAVA_HOME_17=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home # export JAVA_HOME=$JAVA_HOME_8 # CLASS_PATH="$JAVA_HOME/lib" # PATH="$PATH:$JAVA_HOME/bin" # jenv配置 export PATH="$HOME/.jenv/bin:$PATH" eval "$(jenv init -)"
8.2.2 啟用 jenv 的 export 插件
讓 jenv 自動(dòng)管理 JAVA_HOME 環(huán)境變量:
jenv enable-plugin export
8.2.3 重新加載 shell 配置
source ~/.zshrc # 或 source ~/.bash_profile
9. 實(shí)用技巧
9.1 查看當(dāng)前 JDK 版本
jenv version
9.2 刪除不需要的 JDK 版本
jenv remove 1.8.0.452
9.3 查看 jenv 幫助
jenv --help
9.4 項(xiàng)目級(jí)別版本管理
在項(xiàng)目根目錄創(chuàng)建 .java-version 文件,內(nèi)容為 JDK 版本號(hào):
echo "11" > .java-version
這樣每次進(jìn)入該目錄時(shí),jenv 會(huì)自動(dòng)切換到指定版本。
10. 最佳實(shí)踐
- 全局設(shè)置 LTS 版本:建議將最新的 LTS 版本(如 JDK 17)設(shè)置為全局默認(rèn)版本
- 項(xiàng)目級(jí)別管理:為每個(gè)項(xiàng)目設(shè)置合適的 JDK 版本,并提交
.java-version文件到版本控制 - 定期清理:刪除不再使用的 JDK 版本,保持環(huán)境整潔
- 團(tuán)隊(duì)協(xié)作:團(tuán)隊(duì)成員使用相同的
.java-version文件,確保開發(fā)環(huán)境一致
11. 常見問題
Q1: 為什么切換版本后 java -version 沒有變化?
A: 檢查是否有手動(dòng)設(shè)置的 JAVA_HOME 環(huán)境變量,需要注釋掉并啟用 jenv 的 export 插件。
Q2: 如何徹底卸載 jenv?
A: 刪除 ~/.jenv 目錄,并從 shell 配置文件中移除相關(guān)配置。
Q3: jenv 和 SDKMAN 哪個(gè)更好?
A: 兩者各有優(yōu)勢(shì),jenv 專注于 Java 版本管理,SDKMAN 支持更多 JVM 相關(guān)工具。選擇取決于個(gè)人需求。
12. 總結(jié)
Jenv 是一個(gè)輕量級(jí)且強(qiáng)大的 JDK 版本管理工具,能夠有效解決多版本 JDK 共存和切換的問題。通過合理使用 jenv 的全局、shell 和本地版本設(shè)置功能,我們可以為不同的項(xiàng)目靈活配置所需的 JDK 版本,大大提升開發(fā)效率。
記住核心命令:
jenv global <version>- 設(shè)置全局版本jenv local <version>- 設(shè)置項(xiàng)目版本jenv shell <version>- 設(shè)置會(huì)話版本jenv versions- 查看所有版本
掌握了這些基本用法,你就能輕松應(yīng)對(duì)多版本 JDK 的管理需求了。
到此這篇關(guān)于使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程的文章就介紹到這了,更多相關(guān)Jenv管理多版本JDK環(huán)境內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot actuator端點(diǎn)啟用和暴露操作
這篇文章主要介紹了Spring boot actuator端點(diǎn)啟用和暴露操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn)
本文主要介紹了java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
解決Mybatis報(bào)錯(cuò):org.apache.ibatis.reflection.ReflectionException
文章主要討論了在使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作時(shí)遇到的幾個(gè)常見問題及其解決方法,首先,文章指出如果DTO類中沒有定義getter和setter方法,會(huì)導(dǎo)致反射異常,解決方法是使用Lombok的@Data注解自動(dòng)生成這些方法2025-01-01
Spring常用注解 使用注解來構(gòu)造IoC容器的方法
下面小編就為大家分享一篇Spring常用注解 使用注解來構(gòu)造IoC容器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
java使用JDBC連接數(shù)據(jù)庫(kù)的五種方式(IDEA版)
這篇文章主要介紹了java使用JDBC連接數(shù)據(jù)庫(kù)的五種方式(IDEA版),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

