開發者如何管理不同JDK版本

Milo Chen
7 min readNov 29, 2023

--

開發者在開發中如何管理不同JDK版本

我們知道在 NodeJS, React, Python 這些大家熟悉基本工具上,大家都會在不同版本切換作開發,而且也好用的功具可以協助我們,例如 nodejs 的 nvm,n 或是 python 的 conda. 而 Java 的開發環境中,也會有類似的工具:

因此本篇解釋為何使用 SDKMAN 以及使用方式

評估選擇適合的工具

在 Java 的世界中,沒有完全類似於 Python 的 conda 工具,但有一些工具可以用來管理 Java 版本和建立隔離的環境。以下是一些常用的選擇:

  1. SDKMAN!: 這是一個很受歡迎的 Java 工具版本管理器。它可以讓你在不同的 Java 版本之間輕鬆切換,並且支援 Groovy、Scala、Kotlin 等其他 JVM 語言和工具。SDKMAN! 提供了一個簡潔的命令行界面來安裝、切換和管理多個版本。
  2. jEnv: jEnv 是一個專門為 Java 環境設計的版本管理工具。它允許你在不同的項目中使用不同的 Java 版本,非常適合需要在多個 Java 版本之間切換的開發者。
  3. Docker: 雖然 Docker 並非專門為 Java 設計,但它可以用來創建隔離的環境,其中包含特定版本的 Java 和其他依賴。通過 Docker,你可以為每個項目創建一個包含所有必要依賴的容器。
  4. Maven 和 Gradle 的 Profiles: Maven 和 Gradle 都支援 profiles,這可以讓你為不同的環境指定不同的配置和依賴。雖然它們主要用於依賴管理,但也可以用來在不同的環境中使用不同的 Java 版本。

這些工具各有特點,你可以根據個人需求和項目特性選擇最合適的工具。例如,如果你需要頻繁切換 Java 版本,SDKMAN! 或 jEnv 會是不錯的選擇。如果你需要更完整的環境隔離,則 Docker 可能更合適。

SDKMAN! vs jEnv

當比較 SDKMAN! 和 jEnv 這兩個工具時,我們可以從幾個關鍵方面來探討它們的優缺點:

SDKMAN!

優點

  1. 廣泛的支援範圍:SDKMAN! 不僅支持多個版本的 Java,還支持 Groovy、Scala、Kotlin 等其他 JVM 語言和工具。
  2. 易於安裝和使用:SDKMAN! 提供一個直觀的命令行界面,使得安裝和切換版本變得非常簡單。
  3. 自動更新:SDKMAN! 可以自動檢查並通知可用的新版本,方便用戶保持最新。
  4. 獨立性:它不依賴於系統的 Java 安裝,可以在用戶空間內獨立運行。

缺點

  1. 不是環境管理器:SDKMAN! 重點在於管理不同版本的 SDK,而不是創建隔離的開發環境。
  2. 依賴於網絡:安裝和更新 SDK 需要網絡連接。

jEnv

優點

  1. 專注於 Java:jEnv 完全專注於管理不同版本的 Java,適合那些只需要管理 Java 版本的場景。
  2. 項目級別的版本管理:可以輕鬆為每個項目設定不同的 Java 版本,便於多項目開發。
  3. 簡單的版本切換:jEnv 提供簡潔的命令來切換 Java 版本。
  4. 與 shell 緊密集成:可以很容易地集成到 Bash 或 Zsh 等常用 shell 中。

缺點

  1. 功能單一:jEnv 僅用於管理 Java 版本,不支持其他 JVM 語言或工具。
  2. 安裝過程可能複雜:對於某些用戶來說,jEnv 的安裝和配置可能比 SDKMAN! 更為複雜。
  3. 缺乏自動更新機制:相比於 SDKMAN!,jEnv 缺少自動檢測和安裝新版本的功能。

總結

選擇 SDKMAN! 或 jEnv 主要取決於你的具體需求:

  • 如果你需要管理多種 JVM 語言或工具,並且想要一個易於使用和更新的工具,SDKMAN! 是一個不錯的選擇。
  • 如果你主要關注於 Java,並且需要在不同項目間靈活切換 Java 版本,jEnv 可能更適合你。

兩者都是優秀的工具,可以有效地幫助你管理 Java 環境。

註:

「jEnv 僅用於管理 Java 版本,不支持其他 JVM 語言或工具」的意思是,jEnv 這個工具專門設計用來管理不同版本的 Java 執行環境(JRE)和開發環境(JDK)。它的主要功能是讓你在不同的 Java 版本之間進行切換,特別適合於在多個項目中需要使用不同版本的 Java 的情況。

相比之下,jEnv 不具備管理其他基於 Java 虛擬機(JVM)的語言或工具的能力。例如,Groovy、Scala 和 Kotlin 等其他 JVM 語言,或者像 Maven、Gradle 這樣的 Java 构建工具,都不在 jEnv 的管理範圍內。

這與 SDKMAN! 不同,後者不僅可以管理多個版本的 Java,還支持其他多種 JVM 語言和工具的版本管理。這使得 SDKMAN! 更為通用,能夠滿足更廣泛的開發需求。

開始使用 SDKMAN

上手使用 SDKMAN! 是一個相對直觀的過程。以下是一個簡單的指南,幫助你開始使用 SDKMAN!:

Mac/Linux 安裝 SDKMAN!

  1. 打開終端:首先,打開你的命令行界面。這可能是 Terminal (在 macOS 或 Linux) 或者 Command Prompt/PowerShell (在 Windows)。
  2. 安裝命令:在你的終端中執行以下命令來安裝 SDKMAN!:
  3. curl -s "https://get.sdkman.io" | bash
  4. 初始化 SDKMAN!:安裝完成後,你需要執行以下命令來初始化 SDKMAN!:
  5. source "$HOME/.sdkman/bin/sdkman-init.sh"
  6. 驗證安裝:使用以下命令檢查 SDKMAN! 是否安裝成功:
  7. sdk version

使用 SDKMAN! 管理 Java 版本

列出可用的 Java 版本:要查看所有可用的 Java 版本,使用以下命令:

sdk list java

此命令可以查詢已安裝的有哪些

sdk list java | grep installed

  1. 安裝特定版本的 Java:從列表中選擇你想要安裝的 Java 版本,並使用以下命令進行安裝,例如安裝 Java 11:

sdk install java 11.0.2-open

  1. 切換 Java 版本:如果你有多個 Java 版本安裝,可以使用以下命令在它們之間切換,例如切換到 Java 8:

sdk use java 8.0.222-open

  1. 設置預設 Java 版本:要設置某個版本的 Java 為你的預設版本,使用類似的命令:

sdk default java 11.0.2-open

額外提示

  • 查詢幫助:如果你需要獲取更多命令的信息,可以使用 sdk help 命令來查看更多選項和說明。
  • 更新 SDKMAN!:要更新 SDKMAN! 到最新版本,可以使用 sdk selfupdate 命令。
  • 卸載 SDK:如果你想要卸載某個已安裝的 SDK,例如 Java,可以使用 sdk uninstall java 11.0.2-open

這些是基本的步驟和命令,足以讓你開始使用 SDKMAN! 來管理 Java 版本和其他 SDK。隨著使用,你會發現 SDKMAN! 是一個非常強大且靈活的工具,能夠大大簡化 Java 和其他 SDK 的版本管理。

Mac OS X 版本的開發者

當你使用 sdkman 工具安裝了不同java 版本,自己原有系統的 java_home 就被改變,但為了確保Mac OS X 環境一致,所以建議將 sdkman 預設java版本設成跟 Mac OS X 一樣。因此這時候你需要找一下 Mac OS X 真正的JAVA_HOME,以為我例,我會得到此資訊

$ /usr/libexec/java_home
/Users/milochen0418/Library/Java/JavaVirtualMachines/corretto-11.0.21/Contents/Home

我查到一樣跟 corretoo-11.0.21 的版本,因此就可以這樣子安裝

$ sdk install java 11.0.21-amzn

$ sdk default java 11.0.21-amzn

而之後就是想使用不同 java 版本時可以

sdk list java | grep installed

然後再換過去版本

sdk use java 11.0.21-amzn

  1. sdk default java 11.0.2-open

--

--

Milo Chen
Milo Chen

Written by Milo Chen

Study in Law/CS/EE & Dev in blockchain, AI, IoT, mobile app. Good in almost programming language with github https://github.com/milochen0418. 永遠十八歲/對世界好奇/INFP型

No responses yet