安裝jdk似乎是再簡單不過了,但若是想從封存檔來源安裝並能夠納入替代管理清單,那麼需要多一點步驟。 本文介紹如何在Ubuntu中以 apt 安裝及使用封存檔案安裝的方式設定替代管理清單 alternative並且切換欲使用版本。
檢查已安裝配置的 jdk/jre 版本
1
2
$ java -version
$ javac -version
鍵入如上命令,若事前未安裝則會提示可選的安裝版本及指令,若已安裝則顯示已設定的java版本資訊。
使用 apt 安裝
1
$ sudo apt install default-jdk
這裡選擇安裝 default-jdk,可依自身需求調整,通常使用此法安裝後也會自動的設定好 alternatives,幾乎能開始進行開發作業了,但若是有使用到讀取 JAVA_HOME 環境變數的程式那麼後面將會說明方法。
從封存檔案安裝
通常藉由 apt 安裝的 jdk 版本比較舊,而需要使用更新的功能則需要手動下載封存檔案進行安裝,例如從Oracle下載jdk安裝,及其設定的步驟。
1
2
3
4
5
6
7
8
$ #將封存檔解壓縮至目的位置
$ sudo tar xzf jdk-16_linux-x64_bin.tar.gz -C /usr/lib
$ #將 JAVA_HOME 環境變數寫入 /etc/profile
$ sudo echo 'export JAVA_HOME=/usr/lib/jdk-16' > /etc/profile.d/java_path.sh
$ #重新設定一次環境,匯出 JAVA_HOME 環境變數
$ source /etc/profile; source ~/.bashrc
封存檔安裝設定 alternatives
如上的步驟,我們將 jdk 解壓縮並設定了 JAVA_HOME 環境變數,現在使用 alternative 安裝至系統並連結至 /usr/bin,而系統PATH環境變數基本上都會引入 /usr/bin,並且可以利用它進行多個版本切換(不同於 virtualenv),語法如下:
1
update-alternatives --install <link> <name> <path> <priority>
以下是安裝 java 和 javac 的範例(先設定好 JAVA_HOME 環境變數):
1
2
3
4
$ #設定java
$ sudo update-alternatives --install /usr/bin/java java $JAVA_HOME/bin/java 500
$ #設定javac
$ sudo update-alternatives --install /usr/bin/javac javac $JAVA_HOME/bin/javac 500
最後的優先權數字,那是代表著當設定的程式路徑不存在時,選擇由優先權高的替補。
使用 shell 工具執行安裝或指定版本
注意到 java 和 javac 在進行安裝 alternatives 版本時都需要個別設定,而通常有關 jdk 的工具應該也都需要一同更換,為此我寫了一個簡易的shell script,用此工具進行完整的替換比較方便又省事,下載後用法如下:
1
2
3
4
5
$ #使用此工具需要先設定欲使用的jdk JAVA_HOME環境變數
$ #install為安裝及指定版本
$ sudo ./jdk-alternatives.sh install
$ #remote為移除版本,若系統安裝多於一個版本則會依alternative清單優先權進行替換
$ sudo ./jdk-alternatives.sh remove
由 alternative 切換版本
現在我們在系統藉由 apt 安裝 default-jdk 及透過封存檔案安裝 oracle jdk,可以查詢已經安裝的版本:
1
2
3
$ sudo update-alternatives --list java
/usr/lib/jdk-16/bin/java
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
安裝多於一個版本的時候可以使用如下方式選擇使用的版本:
1
2
3
4
5
6
7
8
9
10
11
$ sudo update-alternatives --config java
[sudo] password for charlie:
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode
1 /usr/lib/jdk-16/bin/java 500 manual mode
2 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
Press <enter> to keep the current choice[*], or type selection number:
見上面的輸出,現在系統指定到的版本是 0 編號,若要切換至 jdk-16 版本就鍵入 1 進行切換。
由 alternative 移除版本
若安裝的版本不再需要了,由 alternatives 移除方式語法如下:
1
$ sudo update-alternatives -remove <name> <path>
以下是移除藉由 apt 安裝的 jdk 的例子:
1
$ sudo update-alternatives --remove java /usr/lib/jvm/java-11-openjdk-amd64/bin/java
透過 apt 安裝的套件經過 alternatives 移除僅將替代連結移除,不會將安裝的套件移除,若要清除它執行以下:
1
2
3
4
5
6
7
8
9
10
11
$ #若不知先前安裝的版本,可先查詢藉由 apt 安裝的jdk
$ sudo apt list --installed | grep jdk
default-jdk-headless/focal,now 2:1.11-72 amd64 [installed,automatic]
default-jdk/focal,now 2:1.11-72 amd64 [installed]
openjdk-11-jdk-headless/focal-updates,focal-security,now 11.0.10+9-0ubuntu1~20.04 amd64 [installed,automatic]
openjdk-11-jdk/focal-updates,focal-security,now 11.0.10+9-0ubuntu1~20.04 amd64 [installed,automatic]
openjdk-11-jre-headless/focal-updates,focal-security,now 11.0.10+9-0ubuntu1~20.04 amd64 [installed,automatic]
openjdk-11-jre/focal-updates,focal-security,now 11.0.10+9-0ubuntu1~20.04 amd64 [installed,automatic]
$ #移除已安裝的套件
$ sudo apt autoremove default-jdk
另外要注意的是,藉由 alternatives 安裝的 jdk 不會設定 JAVA_HOME 環境變數,需要再行調整。