多項目開發環境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

📖 摘要

在實際開發中,往往會遇到既要維護老項目又要跟進新特性的場景,這就需要在一臺機器上同時安裝并切換多個Java JDK版本。本文將針對三大主流平臺——Windows、macOS 和 Ubuntu,詳細介紹如何安裝多個 JDK,并使用各自平臺上的“替代方案”工具來管理與切換。

  • Windows:通過系統環境變量與批處理腳本實現版本切換
  • macOS:利用 /usr/libexec/java_home 與 jEnv 工具
  • Ubuntu:深入剖析 update-alternatives 原理與實戰

無論您是新手還是有一定經驗的開發者,都能從中獲得清晰的思路與操作指南。
在這里插入圖片描述


文章目錄

  • 如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)
    • 📖 摘要
    • 📗 引言
    • 作者名片 ??
    • 加入我們AI共創團隊 🌐
    • 加入貓頭虎的共創圈,一起探索編程世界的無限可能! 🚀
  • 正文
    • 1. 🪟 Windows 平臺
      • 1.1 環境變量基礎
      • 1.2 安裝多個 JDK
      • 1.3 手動切換
      • 1.4 使用批處理腳本自動切換
    • 2. 🍎 macOS 平臺
      • 2.1 `/usr/libexec/java_home` 命令
      • 2.2 使用 jEnv 統一管理(推薦)
    • 3. 🐧 Ubuntu 平臺(Debian系)
      • 3.1 `update-alternatives` 原理
      • 3.2 安裝與注冊 JDK
        • 3.2.1 使用 APT 安裝(OpenJDK)
        • 3.2.2 手動下載并注冊 Oracle JDK
      • 3.3 切換與查看
        • 查看當前注冊項
        • 交互式切換
    • 4. ? 驗證與示例
    • 5. 🛠? 常見問題與解決
    • 6. ? 常見 QA
    • 🏁 總結
  • 粉絲福利
      • 聯系我與版權聲明 📩

📗 引言

多版本 JDK 切換為何如此重要?

  • 兼容性測試:老項目可能依賴 Java 8,而新項目需要 Java 17。
  • 生態差異:Spring Boot 2.x 與 3.x 對 Java 版本的要求不同。
  • CI/CD 集成:自動化構建需要在不同 JDK 下驗證構建過程。

三大平臺各有生態與管理方式,因此本文將分別展開,幫助您在不同系統上搭建靈活的多版本 Java 環境。


作者名片 ??

  • 博主貓頭虎
  • 全網搜索關鍵詞貓頭虎
  • 作者微信號Libin9iOak
  • 作者公眾號貓頭虎技術團隊
  • 更新日期2025年07月21日
  • 🌟 歡迎來到貓頭虎的博客 — 探索技術的無限可能!

加入我們AI共創團隊 🌐

  • 貓頭虎AI共創社群矩陣列表
    • 點我進入共創社群矩陣入口
    • 點我進入新矩陣備用鏈接入口

加入貓頭虎的共創圈,一起探索編程世界的無限可能! 🚀


貓頭虎分享No bug

正文


1. 🪟 Windows 平臺

1.1 環境變量基礎

Windows 管理可執行程序的核心是 系統路徑(PATH)環境變量(Environment Variables)。切換 JDK 版本,本質上就是讓系統在 PATH 中優先找到對應版本的 java.exejavac.exe

1.2 安裝多個 JDK

  1. 從 Oracle 官網或 AdoptOpenJDK 下載所需版本的 Windows 安裝包(.exe)。

  2. 依次安裝到不同目錄,如:

    • C:\Program Files\Java\jdk1.8.0_381
    • C:\Program Files\Java\jdk-17.0.7

1.3 手動切換

  1. 打開系統環境變量

    • 右鍵「此電腦」→「屬性」→「高級系統設置」→「環境變量」。
  2. 找到 系統變量 中的 JAVA_HOMEPath

    • 修改 JAVA_HOME 為目標 JDK 目錄。
    • Path 里,將 %JAVA_HOME%\bin 放到最前面。
  3. 點擊「確定」,重新打開命令行窗口,即可 java -version 驗證。

1.4 使用批處理腳本自動切換

為了避免每次手動修改環境變量,可編寫簡單的 .bat 腳本:

@echo off
REM 切換到 Java 8
setx JAVA_HOME "C:\Program Files\Java\jdk1.8.0_381" /M
setx PATH "%%JAVA_HOME%%\bin;%%PATH%%" /M
echo 已切換到 Java 8
  • 保存為 switch-to-java8.bat,右鍵以管理員身份運行。
  • 同理可寫 switch-to-java17.bat
  • 運行后重啟命令行窗口即可生效。

2. 🍎 macOS 平臺

2.1 /usr/libexec/java_home 命令

macOS 自帶命令 /usr/libexec/java_home,可列出并切換已安裝的 JDK 版本。

# 列出所有已安裝JDK
/usr/libexec/java_home -V# 切換到 Java 11
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
export PATH=$JAVA_HOME/bin:$PATH
  • -V:顯示版本列表及安裝路徑。
  • -v <version>:選擇指定版本。

將上述兩行寫入 ~/.zshrc~/.bash_profile,并配合 alias:

alias j8='export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)'
alias j11='export JAVA_HOME=$(/usr/libexec/java_home -v 11)'
alias j17='export JAVA_HOME=$(/usr/libexec/java_home -v 17)'

打開新終端后,輸入 j11 即可切換。

2.2 使用 jEnv 統一管理(推薦)

jEnv 是跨平臺的 Java 版本管理工具,支持 macOS、Linux。

  1. 安裝 jEnv(需先安裝 Homebrew):

    brew install jenv
    
  2. 將 jEnv 集成到 shell 配置:

    echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
    echo 'eval "$(jenv init -)"' >> ~/.zshrc
    source ~/.zshrc
    
  3. 添加已安裝的 JDK:

    jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_381.jdk/Contents/Home
    jenv add /Library/Java/JavaVirtualMachines/jdk-17.0.7.jdk/Contents/Home
    
  4. 列出與切換:

    jenv versions
    jenv global 11          # 全局切換到 Java 11
    jenv local 1.8 .        # 針對當前目錄切換到 Java 1.8
    jenv shell 17           # 僅對當前 shell 有效
    

jEnv 會自動管理 JAVA_HOMEPATH,并支持插件擴展(Maven、Gradle 插件等)。


3. 🐧 Ubuntu 平臺(Debian系)

3.1 update-alternatives 原理

  • Debian/Ubuntu 引入 alternatives 系統,允許對系統命令(如 javajavac)創建“組”,并在組內注冊多個“備選項”。
  • 每個備選項由 可執行文件路徑優先級 組成。
  • 運行 update-alternatives --config <name> 即可交互式切換。

3.2 安裝與注冊 JDK

3.2.1 使用 APT 安裝(OpenJDK)
sudo apt update
sudo apt install -y openjdk-8-jdk openjdk-11-jdk openjdk-17-jdk

APT 安裝后通常會自動注冊到 alternatives,您可以直接執行下一步。

3.2.2 手動下載并注冊 Oracle JDK
  1. 下載并解壓到 /usr/lib/jvm

    sudo mkdir -p /usr/lib/jvm
    sudo tar -xzf ~/Downloads/jdk-17.0.7_linux-x64_bin.tar.gz -C /usr/lib/jvm
    
  2. 注冊到 alternatives(以 Java 17 為例,優先級設為 2):

    sudo update-alternatives --install /usr/bin/java   java   /usr/lib/jvm/jdk-17.0.7/bin/java   2
    sudo update-alternatives --install /usr/bin/javac  javac  /usr/lib/jvm/jdk-17.0.7/bin/javac  2
    sudo update-alternatives --install /usr/bin/jar    jar    /usr/lib/jvm/jdk-17.0.7/bin/jar    2
    
    • 第三個參數為命令組名(可省略后綴)。
    • 最后一個數字為優先級,數值越大越優先。

3.3 切換與查看

查看當前注冊項
update-alternatives --query java

輸出包含所有 java 備選路徑及當前選擇。

交互式切換
sudo update-alternatives --config java

會列出所有已注冊的 Java 可執行文件,按提示輸入對應序號即可切換。
同理切換 javacjar 等。


4. ? 驗證與示例

無論在哪個平臺,切換后都應首先驗證:

java -version
javac -version

并可編寫最簡單的 HelloWorld 程序進行編譯與運行測試。


5. 🛠? 常見問題與解決

場景原因與排查解決思路
切換后 java -version 仍指向舊版本PATH 未更新或 shell 緩存未刷新重新打開終端;Windows 重啟 CMD;Linux hash -r
Windows 腳本執行報 “權限不足”未以管理員身份運行 .bat右鍵 → “以管理員身份運行”
macOS /usr/libexec/java_home 列不全JDK 未正確安裝到 /Library/Java/...檢查 JDK 文件夾;重啟 shell
Ubuntu 手動注冊后未見新選項alternatives 配置不一致再次執行 --install;檢查路徑拼寫

6. ? 常見 QA

  • Q:為什么 Linux 上要用 update-alternatives
    A:它能同時管理多個版本的同名命令,避免手動修改 PATH,且支持優先級與腳本化。

  • Q:Windows 有沒有類似 update-alternatives 的工具?
    A:官方沒有,但可借助 jabba 或自定義批處理腳本。

  • Q:macOS 上除了 jEnv 還有其他方案嗎?
    A:也可使用 SDKMAN! 管理,但 SDKMAN! 對 Windows 支持有限。


🏁 總結

本文深入對比了 Windows、macOS 和 Ubuntu 三大平臺上多版本 Java JDK 管理的思路與實踐:

  • Windows:環境變量 + 批處理腳本
  • macOS:/usr/libexec/java_home + jEnv
  • Ubuntu:update-alternatives 原理詳解

掌握上述方法后,無論在本地開發還是在 CI/CD 環境,都能靈活切換 JDK 版本,確保兼容性與高效協同開發。祝您 Java 開發之路順暢!🚀

貓頭虎

粉絲福利


👉 更多信息:有任何疑問或者需要進一步探討的內容,歡迎點擊文末名片獲取更多信息。我是貓頭虎博主,期待與您的交流! 🦉💬


聯系我與版權聲明 📩

  • 聯系方式
    • 微信: Libin9iOak
    • 公眾號: 貓頭虎技術團隊
  • 版權聲明
    本文為原創文章,版權歸作者所有。未經許可,禁止轉載。更多內容請訪問貓頭虎的博客首頁。

點擊???下方名片???,加入貓頭虎AI共創社群矩陣。一起探索科技的未來,共同成長。🚀

🔗 貓頭虎抱團AI共創社群 | 🔗 Go語言VIP專欄 | 🔗 GitHub 代碼倉庫 | 🔗 Go生態洞察專欄
? 貓頭虎精品博文

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93891.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣57:插入區間

力扣57:插入區間題目思路代碼題目 給你一個 無重疊的 &#xff0c;按照區間起始端點排序的區間列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 個區間的開始和結束&#xff0c;并且 intervals 按照 starti 升序排列。同樣給定一個區間 newInterval […

KVM虛擬化技術解析:從企業應用到個人創新的開源力量

1 .KVM&#xff1a;開源虛擬化的核心引擎 KVM&#xff08;Kernel-based Virtual Machine&#xff09;作為Linux內核原生集成的開源虛擬化模塊&#xff0c;徹底改變了現代數據中心的虛擬化格局。它通過將Linux內核轉變為Type-1型虛擬機監控器&#xff08;Hypervisor&#xff09;…

28.Linux :通過源代碼編譯安裝lamp

Linux &#xff1a;通過源代碼編譯安裝lamp 區別特性源代碼編譯安裝yum 安裝安裝方式從源代碼編譯構建預編譯的二進制包自定義程度高度可定制有限定制性能優化可針對特定硬件優化通用優化依賴管理手動解決依賴關系自動解決依賴安裝復雜度復雜&#xff0c;需技術經驗簡單&#x…

應用控制技術

一、 應用特征識別技術1.傳統行為檢測技術1.1 五元組檢測原理1.2 配置思路1.3 效果展示需求背景21.4 傳統行為檢測的缺陷無法識別應用層內容&#xff1a;若應用更換端口&#xff08;如QQ改用隨機端口&#xff09;或偽裝協議&#xff08;如HTTPS加密&#xff09;&#xff0c;傳統…

當MySQL的int不夠用了

關于int的長度很多時候看到int(8)這樣的定義&#xff0c;其實這是工具導出的不專業。int是范圍&#xff0c;不是長度。在開發有了共識&#xff08;知道這個長度不算數&#xff0c;要看范圍&#xff09;以后&#xff0c;上來就是所有的類型都是bigint。int的范圍int的取值范圍是…

讓AI學會“邊做邊想“:ReAct的實戰指南

小智的求職困境有個叫小智的AI助手&#xff0c;它剛從"大語言模型大學"畢業&#xff0c;滿懷信心地去應聘一家咨詢公司的智能助理職位。面試官問&#xff1a;"北京和上海哪個城市人口更多&#xff1f;"小智立刻回答&#xff1a;"根據我的知識&#xf…

vue優化有哪些手段?

vue本身存在的方法 v-if 和v-show 的合理運用,頻繁使用的組件使用v-show,不頻繁的使用v-if,來減少dom的渲染路由懶加載 采用()>import(index.vue)當路由被訪問的時候才回去加載使用keep-alive緩存頁面,減少沒必要的重復渲染同時也可以減少服務器的壓力使用computed緩存數據,…

【圖像算法 - 14】精準識別路面墻體裂縫:基于YOLO12與OpenCV的實例分割智能檢測實戰(附完整代碼)

摘要&#xff1a; 裂縫是結構健康的重要隱患&#xff0c;傳統人工巡檢耗時耗力且易遺漏。本文將帶您利用當前最先進的YOLO12實例分割模型&#xff0c;構建一個高效、準確、更高精度的裂縫檢測系統。我們將從數據準備、模型訓練到結果可視化&#xff0c;手把手實現一個完整的項目…

“讓機器人更智慧 讓具身體更智能”北京世界機器人大會行業洞察

2025年8月8日&#xff0c;世界機器人大會在北京盛大開幕。本屆大會以“讓機器人更智慧 讓具身體更智能”為主題&#xff0c;由中國電子學會、世界機器人合作組織主辦&#xff0c;包括開幕式、閉幕式、論壇等。同期舉辦世界機器人博覽會、世界機器人大賽等活動&#xff0c;打造了…

PHP如何使用JpGraph生成折線圖?

JpGraph是一個功能強大的PHP圖表庫&#xff0c;它通過封裝GD庫函數&#xff0c;為開發者提供了簡單高效的數據可視化解決方案。作為專門用于繪制統計圖的面向對象庫&#xff0c;JpGraph支持創建折線圖、柱狀圖、餅圖等20余種圖表類型&#xff0c;并能自動處理坐標軸、刻度、圖例…

超級云平臺:重構數字生態的“超級連接器“

在數字經濟浪潮席卷全球的今天,企業數字化轉型已從"選擇題"變為"必答題"。然而,傳統云服務模式因技術壁壘高、資源分散、協同效率低等問題,讓許多企業在數字化轉型中陷入"上云易、用云難"的困境。 在此背景下,一種以"全域資源整合+智能…

https如何保證傳遞參數的安全

HTTPS 并非直接“加密參數”&#xff0c;而是通過一整套加密傳輸機制&#xff0c;確保客戶端與服務器之間所有通信內容&#xff08;包括 URL 參數、表單數據、Cookie 等&#xff09;在傳輸過程中不被竊聽、篡改或偽造。其核心安全保障來自以下技術實現&#xff1a; 一、核心加密…

OpenHarmony之打造全場景智聯基座的“分布式星鏈 ”WLAN子系統

1. 技術架構概覽 無線局域網(Wireless Local Area Networks,WLAN),是通過無線電、紅外光信號或者其他技術發送和接收數據的局域網,用戶可以通過WLAN實現結點之間無物理連接的網絡通訊。常用于用戶攜帶可移動終端的辦公、公眾環境中。 WLAN組件子系統為用戶提供WLAN基礎功…

JMeter(入門篇)

一.簡介 JMeter 是 Apache 組織使用 Java 開發的一款測試工具。 1、可以用于對服務器、網絡或對象模擬巨大的負載 2、通過創建帶有斷言的腳本來驗證程序是否能返回期望的結果 二.優缺點 優點&#xff1a; 開源、免費 跨平臺 支持多協議 小巧 功能強大 缺點&#xff…

Lecture 12: Concurrency 5

回顧&#xff1a;并行用餐哲學家讀者/作者問題哲學家進餐問題方案三&#xff1a;最大化并行需要一個更復雜的解決方案來實現最大的并行性 解決方案使用&#xff1a;state[N]&#xff1a;每個哲學家的當前狀態&#xff08;THINKING&#xff0c; HUNGRY&#xff0c; EATING&#…

UniApp 微信小程序之間跳轉指南

概述 在UniApp開發中&#xff0c;經常需要實現從當前小程序跳轉到其他微信小程序的功能。本文檔詳細介紹了如何在UniApp中實現微信小程序之間的跳轉。 核心API uni.navigateToMiniProgram() 這是UniApp提供的用于跳轉到其他微信小程序的核心API。 基本語法 uni.navigateToMiniP…

基于SpringBoot+Vue的養老院管理系統的設計與實現 智能養老系統 養老架構管理 養老小程序

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

TRAE調教指南:用6A工作流項目規則+5S敏捷個人規則打造高效AI開發流程

TRAE調教指南&#xff1a;用6A工作流項目規則5S敏捷個人規則打造高效AI開發流程 引言&#xff1a;從"AI瞎寫"到"精準交付"的實戰手冊一、什么是Rules&#xff1a;讓AI"聽話"的底層邏輯1. 告別重復指令疲勞2. 實現"千人千面"的個性化適…

【C語言】gets和getchar的區別

在C語言中&#xff0c;gets和getchar是兩個用于輸入的標準函數&#xff0c;它們在功能和用法上有所不同。 功能上&#xff1a; gets函數主要用于讀取一行字符串&#xff0c;直到遇到換行符&#xff08;回車鍵&#xff09;為止。它會自動過濾掉換行符&#xff0c;不會將其讀入到…

【數據結構與算法】數據結構初階:詳解二叉樹(一)

&#x1f525;個人主頁&#xff1a;胡蘿卜3.0 &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》《數據結構》 《C干貨分享》 ??人生格言&#xff1a;不試試怎么知道自己行不行 正片開始之前&#xff0c;我們來了解一下我們即…