[Java] 使用 SDKMAN! 來管理不同的 Java 版本

[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 版本了,

目前用起來還算習慣,大家也可以試試囉~^^

(本頁面已被瀏覽過 199 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料