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

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

我不太會寫 Java,平常只有在某個要安裝的軟體要用到 Java 時,

才會去找對應的 JRE 或是 JDK 來安裝,

不過這樣系統裡的 Java 版本就可能會有好幾種,

感覺還是需要一個軟體來管理比較好…

 

上網找了一下近年來比較有被討論的,看來是 SDKMAN! 這套,

以名字來說其實取的不是很優,畢竟 SDK 也不專屬於某種語言,

不過還是來用看看吧~

 

1. 安裝 SDKMAN!

執行下面指令在 Mac 上安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -s "https://get.sdkman.io" | bash
curl -s "https://get.sdkman.io" | bash
curl -s "https://get.sdkman.io" | bash

 

安裝好後,在新的終端機視窗就可以執行  

sdk
sdk 這個指令了:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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
sdk list java 列出 SDKMAN! 支援的 Java 版本,

可以看到有許多廠商的 Java 版本:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
......
$ 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 ......
$ 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 吧:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sdk install java 17.0.8-oracle
sdk install java 17.0.8-oracle
sdk install java 17.0.8-oracle

 

裝好之後,在 

sdk list java
sdk list java 的結果中,17.0.8 版本就會被標成 installed:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sdk install java 20.0.2-oracle
sdk install java 20.0.2-oracle
sdk install java 20.0.2-oracle

 

3. 切換 Java 版本

我們可以執行  

sdk use java
sdk use java 來指定現在的 Shell 要使用的 Java 版本,

這個設定不會影響到新的 Shell 或其他的 Shell:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sdk use java 17.0.8-oracle
Using java version 17.0.8-oracle in this shell.
$ sdk use java 17.0.8-oracle Using java version 17.0.8-oracle in this shell.
$ sdk use java 17.0.8-oracle

Using java version 17.0.8-oracle in this shell.

 

也可以執行  

sdk default java
sdk default java 設定預設值,

這樣所有新的 Shell 都會使用這個 Java 版本:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sdk default java 17.0.8-oracle
setting java 17.0.8-oracle as the default version for all shells.
$ sdk default java 17.0.8-oracle setting java 17.0.8-oracle as the default version for all shells.
$ sdk default java 17.0.8-oracle

setting java 17.0.8-oracle as the default version for all shells.

 

檢查一下目前使用的  

java
java 和  
javac
javac 的版本,

確實是 17.0.8 沒錯:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sdk install maven
sdk install maven
sdk install maven

 

執行  

sdk current
sdk current 就可以列出目前使用的所有軟體版本了:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sdk current
Using:
java: 17.0.8-oracle
maven: 3.9.4
$ sdk current Using: java: 17.0.8-oracle maven: 3.9.4
$ sdk current

Using:

java: 17.0.8-oracle
maven: 3.9.4

 

5. SDKMAN! 的運作

來稍微看一下 SDKMAN! 怎麼運作的吧~

看起來東西是被裝在 ~/.sdkman/candidates/java/<java version> 目錄下面:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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
tree 檢視一下,

可以看到 SDKMAN! 是將東西裝在 ~/.sdkman/candidates/<app>/<version> 裡,

再用一個 symbolic link “current” 來指向目前使用中的版本:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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
java 和  
javac
javac 時,才會執行到目前使用中的版本:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ echo $PATH
/Users/testuser/.sdkman/candidates/maven/current/bin:/Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin:...
$ echo $PATH /Users/testuser/.sdkman/candidates/maven/current/bin:/Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin:...
$ echo $PATH
/Users/testuser/.sdkman/candidates/maven/current/bin:/Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin:...

 

有了 SDKMAN! 確實就可以很方便的管理不同的 Java 版本了,

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

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

發佈留言

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

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