[Java] 使用 SDKMAN! 來管理不同的 Java 版本
我不太會寫 Java,平常只有在某個要安裝的軟體要用到 Java 時,
才會去找對應的 JRE 或是 JDK 來安裝,
不過這樣系統裡的 Java 版本就可能會有好幾種,
感覺還是需要一個軟體來管理比較好…
上網找了一下近年來比較有被討論的,看來是 SDKMAN! 這套,
以名字來說其實取的不是很優,畢竟 SDK 也不專屬於某種語言,
不過還是來用看看吧~
1. 安裝 SDKMAN!
執行下面指令在 Mac 上安裝:
curl -s "https://get.sdkman.io" | bash
安裝好後,在新的終端機視窗就可以執行 sdk
這個指令了:
$ sdk help NAME sdk - The command line interface (CLI) for SDKMAN! SYNOPSIS sdk <subcommand> [candidate] [version] DESCRIPTION SDKMAN! is a tool for managing parallel versions of multiple JVM related Software Development Kits on most Unix based systems. It provides a convenient Command Line Interface (CLI) and API for installing, switching, removing and listing Candidates. SUBCOMMANDS & QUALIFIERS help [subcommand] install <candidate> [version] [path] uninstall <candidate> <version> list [candidate] use <candidate> <version> config no qualifier default <candidate> [version] home <candidate> <version> env [init|install|clear] current [candidate] upgrade [candidate] version no qualifier offline [enable|disable] selfupdate [force] update no qualifier flush [tmp|metadata|version] EXAMPLES sdk install java 17.0.0-tem sdk help install
2. 用 SDKMAN! 安裝特定 Java SDK
執行 sdk list java
列出 SDKMAN! 支援的 Java 版本,
可以看到有許多廠商的 Java 版本:
$ sdk list java ================================================================================ Available Java Versions for macOS 64bit ================================================================================ Vendor | Use | Version | Dist | Status | Identifier -------------------------------------------------------------------------------- Corretto | | 20.0.2 | amzn | | 20.0.2-amzn | | 20.0.1 | amzn | | 20.0.1-amzn | | 17.0.8 | amzn | | 17.0.8-amzn ...... Oracle | | 20.0.2 | oracle | | 20.0.2-oracle | | 20.0.1 | oracle | | 20.0.1-oracle | | 17.0.8 | oracle | | 17.0.8-oracle | | 17.0.7 | oracle | | 17.0.7-oracle ......
因為這次我要裝 Java 是因為要上課,所以得裝指定的 Oracle Java 17.0 版本,
就來裝 17.0.8-oracle 吧:
sdk install java 17.0.8-oracle
裝好之後,在 sdk list java
的結果中,17.0.8 版本就會被標成 installed:
Oracle | | 20.0.2 | oracle | | 20.0.2-oracle | | 20.0.1 | oracle | | 20.0.1-oracle | >>> | 17.0.8 | oracle | installed | 17.0.8-oracle | | 17.0.7 | oracle | | 17.0.7-oracle
上圖裡有個 >>> 代表的是目前使用中的版本。
我們可以用一樣的方法安裝更多的 Java 版本,
像是再裝一個 Oracle Java 20.0:
sdk install java 20.0.2-oracle
3. 切換 Java 版本
我們可以執行 sdk use java
來指定現在的 Shell 要使用的 Java 版本,
這個設定不會影響到新的 Shell 或其他的 Shell:
$ sdk use java 17.0.8-oracle Using java version 17.0.8-oracle in this shell.
也可以執行 sdk default java
設定預設值,
這樣所有新的 Shell 都會使用這個 Java 版本:
$ sdk default java 17.0.8-oracle setting java 17.0.8-oracle as the default version for all shells.
檢查一下目前使用的 java
和 javac
的版本,
確實是 17.0.8 沒錯:
$ java -version java version "17.0.8" 2023-07-18 LTS Java(TM) SE Runtime Environment (build 17.0.8+9-LTS-211) Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+9-LTS-211, mixed mode, sharing) $ javac -version javac 17.0.8
4. 安裝其他 Java 相關軟體
SDKMAN! 不只可以用來安裝 Java SDK,還可以裝其他相關的軟體,
像是安裝最新版的 maven:
sdk install maven
執行 sdk current
就可以列出目前使用的所有軟體版本了:
$ sdk current Using: java: 17.0.8-oracle maven: 3.9.4
5. SDKMAN! 的運作
來稍微看一下 SDKMAN! 怎麼運作的吧~
看起來東西是被裝在 ~/.sdkman/candidates/java/<java version> 目錄下面:
$ which java /Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin/java $ which javac /Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin/javac
用 tree
檢視一下,
可以看到 SDKMAN! 是將東西裝在 ~/.sdkman/candidates/<app>/<version> 裡,
再用一個 symbolic link “current” 來指向目前使用中的版本:
$ tree -d -L 3 ~/.sdkman/candidates/ /Users/testuser/.sdkman/candidates/ ├── java │ ├── 17.0.8-oracle │ │ ├── bin │ │ ├── conf │ │ ├── include │ │ ├── jmods │ │ ├── legal │ │ ├── lib │ │ └── man │ ├── 20.0.2-oracle │ │ ├── bin │ │ ├── conf │ │ ├── include │ │ ├── jmods │ │ ├── legal │ │ ├── lib │ │ └── man │ └── current -> /Users/testuser/.sdkman/candidates/java/17.0.8-oracle └── maven ├── 3.9.4 │ ├── bin │ ├── boot │ ├── conf │ └── lib └── current -> 3.9.4
然後 PATH 環境變數看來也會被修改,
所以執行 java
和 javac
時,才會執行到目前使用中的版本:
$ echo $PATH /Users/testuser/.sdkman/candidates/maven/current/bin:/Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin:...
有了 SDKMAN! 確實就可以很方便的管理不同的 Java 版本了,
目前用起來還算習慣,大家也可以試試囉~^^