我不太會寫 Java,平常只有在某個要安裝的軟體要用到 Java 時,
才會去找對應的 JRE 或是 JDK 來安裝,
不過這樣系統裡的 Java 版本就可能會有好幾種,
感覺還是需要一個軟體來管理比較好…
上網找了一下近年來比較有被討論的,看來是 SDKMAN! 這套,
以名字來說其實取的不是很優,畢竟 SDK 也不專屬於某種語言,
不過還是來用看看吧~
1. 安裝 SDKMAN!
執行下面指令在 Mac 上安裝:
curl -s "https://get.sdkman.io" | bash
curl -s "https://get.sdkman.io" | bash
curl -s "https://get.sdkman.io" | bash
安裝好後,在新的終端機視窗就可以執行
sdk
sdk
這個指令了:
sdk - The command line interface (CLI) for SDKMAN!
sdk <subcommand> [candidate] [version]
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.
install <candidate> [version] [path]
uninstall <candidate> <version>
use <candidate> <version>
default <candidate> [version]
home <candidate> <version>
flush [tmp|metadata|version]
sdk install java 17.0.0-tem
$ 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 版本:
================================================================================
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 吧:
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:
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:
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:
$ 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 版本:
$ 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 沒錯:
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)
$ 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:
sdk install maven
執行
sdk current
sdk current
就可以列出目前使用的所有軟體版本了:
$ 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> 目錄下面:
/Users/testuser/.sdkman/candidates/java/17.0.8-oracle/bin/java
/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” 來指向目前使用中的版本:
$ tree -d -L 3 ~/.sdkman/candidates/
/Users/testuser/.sdkman/candidates/
│ └── current -> /Users/testuser/.sdkman/candidates/java/17.0.8-oracle
$ 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
時,才會執行到目前使用中的版本:
/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 次)