使用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
- 某些特定框架對 JDK 版本有嚴(yán)格要求
手動切換 JAVA_HOME 環(huán)境變量既繁瑣又容易出錯。Jenv 是一個優(yōu)秀的 JDK 版本管理工具,可以讓我們輕松地在不同 JDK 版本間切換。
2. 什么是 Jenv
Jenv 是一個命令行工具,用于管理多個 Java 版本。它類似于 Node.js 的 nvm 或 Ruby 的 rbenv,可以:
- 全局設(shè)置默認(rèn) JDK 版本
- 為特定 shell 會話設(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)境:
對于 Zsh 用戶:
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(jenv init -)"' >> ~/.zshrc source ~/.zshrc
對于 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
初次安裝可能會看到一些錯誤信息,這是正常的,我們接下來會逐步配置:
[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
這個命令會列出所有已安裝的 JDK 版本及其安裝路徑:

6. 添加 JDK 版本到 Jenv
6.1 添加單個 JDK 版本
使用 jenv add 命令添加 JDK 版本:
# 語法:jenv add {JDK安裝目錄}
jenv add /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
添加成功后會顯示:
zulu64-17.0.15 added 17.0.15 added 17.0 added 17 added
6.2 批量添加多個 JDK 版本
你可以逐個添加所有已安裝的 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
輸出示例(帶 * 號的是當(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 會話的 JDK 版本
# 在當(dāng)前 shell 會話中臨時使用 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
這會在項(xiàng)目根目錄下創(chuàng)建一個 .java-version 文件,每次進(jìn)入該目錄時會自動切換到指定的 JDK 版本。
8. 解決 JAVA_HOME 沖突問題
8.1 常見問題
如果你發(fā)現(xiàn)切換 JDK 版本后 java -version 沒有變化,很可能是因?yàn)橹笆謩釉O(shè)置的 JAVA_HOME 環(huán)境變量覆蓋了 jenv 的設(shè)置。
8.2 解決方案
8.2.1 注釋掉手動的 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 自動管理 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)目級別版本管理
在項(xiàng)目根目錄創(chuàng)建 .java-version 文件,內(nèi)容為 JDK 版本號:
echo "11" > .java-version
這樣每次進(jìn)入該目錄時,jenv 會自動切換到指定版本。
10. 最佳實(shí)踐
- 全局設(shè)置 LTS 版本:建議將最新的 LTS 版本(如 JDK 17)設(shè)置為全局默認(rèn)版本
- 項(xiàng)目級別管理:為每個項(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: 檢查是否有手動設(shè)置的 JAVA_HOME 環(huán)境變量,需要注釋掉并啟用 jenv 的 export 插件。
Q2: 如何徹底卸載 jenv?
A: 刪除 ~/.jenv 目錄,并從 shell 配置文件中移除相關(guān)配置。
Q3: jenv 和 SDKMAN 哪個更好?
A: 兩者各有優(yōu)勢,jenv 專注于 Java 版本管理,SDKMAN 支持更多 JVM 相關(guān)工具。選擇取決于個人需求。
12. 總結(jié)
Jenv 是一個輕量級且強(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è)置會話版本jenv versions- 查看所有版本
掌握了這些基本用法,你就能輕松應(yīng)對多版本 JDK 的管理需求了。
到此這篇關(guān)于使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程的文章就介紹到這了,更多相關(guān)Jenv管理多版本JDK環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式
這篇文章主要介紹了SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java IO流之節(jié)點(diǎn)流與字符流的相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java節(jié)點(diǎn)流與字符流展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
簡單聊一聊Java線程池ThreadPoolExecutor
在使用線程池之后,開啟線程就變成了在線程池當(dāng)中找到一個空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下2022-06-06
spring?boot集成redisson的最佳實(shí)踐示例
這篇文章主要為大家介紹了spring?boot集成redisson的最佳實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03

