譯者 | 胥磊
審校 | 孫淑娟 梁策
1. 前言
不久前,我的一位同事向我展示了他是如何使用 SDKMAN,以及如何輕松在他的 Linux 系統(tǒng)上維護(hù)不同版本的 JDK、Maven等等。我以前聽說過 SDKMAN,當(dāng)時沒有花時間去仔細(xì)研究,不過現(xiàn)在我已經(jīng)掌握了它的使用方法。
在開始使用 SDKMAN 之前,我查看了我的 Linux上JDK的版本(使用的是Ubuntu 20.04.4 LTS 版本)。
首先,我查了下update-alternatives命令返回的Java版本的列表。發(fā)現(xiàn)我的系統(tǒng)里有兩個Java 11版本。
Shell
$ update-alternatives --list java
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/jdk-11.0.3+7/bin/java
我還通過 IntelliJ 安裝過JDK,這些可以在你系統(tǒng)的home 目錄下的.Jdks里找到。這就有了3個不同的Java版本。
Shell
$ ls .jdks/
openjdk-14.0.1 openjdk-16.0.2
openjdk-14.0.1-intellij-downloader-info.txt openjdk-17
所以結(jié)論就是:我已經(jīng)把系統(tǒng)搞的一團(tuán)糟了。現(xiàn)在,讓我們看看 SDKMAN 是否能夠幫助我去清理系統(tǒng)環(huán)境,并刪除所有冗余的JDK。
2. 安裝
SDKMAN 的安裝非常簡單,只需要執(zhí)行以下的命令:
Shell
$ curl -s "https://get.sdkman.io" | bash
...
All done!
Please open a new terminal, or run the following in the existing one:
source "/home/<your user>/.sdkman/bin/sdkman-init.sh"
Then issue the following command:
sdk help
Enjoy!!!
通過source命令讀取和執(zhí)行所需要的初始化文件里的命令:
Shell
$ source "/home/<your user>/.sdkman/bin/sdkman-init.sh"
您可以通過請求 SDKMAN 的版本來驗(yàn)證安裝是否成功。
Shell
$ sdk version
==== BROADCAST =================================================================
* 2022-03-03: jbang 0.90.2 available on SDKMAN! https://github.com/jbangdev/jbang/releases/tag/v0.90.2
* 2022-03-02: quarkus 2.7.3.Final available on SDKMAN! https://github.com/quarkusio/quarkus/releases/tag/2.7.3.Final
* 2022-02-28: micronaut 3.3.4 available on SDKMAN!
================================================================================
SDKMAN 5.13.2
如你所見,最新版本也展示出來了,這對于獲得最新的可用版本通知同樣非常有幫助。
以上就是SDKMAN安裝的全部內(nèi)容。
3. JDK列表
您可以通過查看網(wǎng)站或者執(zhí)行l(wèi)ist 命令來了解哪些工具包可以通過 SDKMAN 進(jìn)行安裝。您也可以重新通過less這個基本命令進(jìn)行分頁來翻閱和搜索列表。
Shell
$ sdk list
可以通過list命令后綴java參數(shù)來獲取更詳細(xì)的JDK可用版本列表,當(dāng)然這些可用的 JDK也可以在網(wǎng)站上找到。此外也可以重新通過less命令進(jìn)行分頁輸出。
Shell
$ sdk list java
4.安裝JDK
首先,我將要核實(shí)系統(tǒng)中默認(rèn)使用的是哪個版本的 Java??磥砦沂褂玫氖?AdoptOpenJDK 11.0.3版本,這個比我預(yù)想的要老。
Shell
$ java --version
openjdk 11.0.3 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
從 SDKMAN選擇由Adoptium 提供的名為Eclipse Temurin 的AdoptOpenJDK,安裝最新的 JDK 17 LTS 版本。
Shell
$ sdk install java 17.0.2-tem
Downloading: java 17.0.2-tem
In progress...
Repackaging Java 17.0.2-tem...
Done repackaging...
Installing: java 17.0.2-tem
Done installing!
Setting java 17.0.2-tem as default.
再次驗(yàn)證下默認(rèn)的 Java 的版本號,它已經(jīng)更改為你剛剛安裝的版本。
Shell
$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode, sharing)
當(dāng)然也可以通過同樣的方式安裝 JDK 11 LTS 版本。最后問題來了,你是否希望這個 JDK 成為默認(rèn)版本?當(dāng)然不是了,JDK 17才是最新 LTS 版本,理應(yīng)作為默認(rèn)版本。
Shell
$ sdk install java 11.0.14-tem
Downloading: java 11.0.14-tem
In progress...
Repackaging Java 11.0.14-tem...
Done repackaging...
Installing: java 11.0.14-tem
Done installing!
Do you want java 11.0.14-tem to be set as default? (Y/n): n
5.默認(rèn)JDK
如果您改變初衷,仍然希望使用JDK 11作為默認(rèn)版本,那么您可以使用default命令來實(shí)現(xiàn)這一點(diǎn)。
Shell
$ sdk default java 11.0.14-tem
Default java version set to 11.0.14-tem
對此驗(yàn)證一下:
Shell
$ java --version
openjdk 11.0.14 2022-01-18
OpenJDK Runtime Environment Temurin-11.0.14+9 (build 11.0.14+9)
OpenJDK 64-Bit Server VM Temurin-11.0.14+9 (build 11.0.14+9, mixed mode)
然后把它重新設(shè)置為 JDK 17。
Shell
$ sdk default java 17.0.2-tem
Default java version set to 17.0.2-tem
當(dāng)然也可以僅通過在終端回話中使用 use 命令來更改默認(rèn)的 JDK。
Shell
$ sdk use java 11.0.14-tem
Using java version 11.0.14-tem in this shell.
在這個命令窗口中,看到當(dāng)前使用的JDK版本是JDK11。
Shell
$ java --version
openjdk 11.0.14 2022-01-18
OpenJDK Runtime Environment Temurin-11.0.14+9 (build 11.0.14+9)
OpenJDK 64-Bit Server VM Temurin-11.0.14+9 (build 11.0.14+9, mixed mode)
打開另一個終端窗口,發(fā)現(xiàn)JDK版本仍然是 JDK 17。需要注意的是, JAVA_HOME 環(huán)境變量也是指向正確的 Java 版本。
Shell
$ echo $JAVA_HOME
/home/<your user>/.sdkman/candidates/java/current
6.清除其他的JDK
當(dāng)前的JDK已經(jīng)是通過 SDKMAN 安裝的,是時候清除系統(tǒng)中的其他JDK了。
Shell
$ dpkg --list | grep jdk
ii openjdk-11-jre-headless:amd64 11.0.13+8-0ubuntu1~20.04
移除openjdk-11-jre-headless:amd64
Shell
$ sudo apt remove openjdk-11-jre-headless:amd64
再次通過 update-alternatives命令進(jìn)行驗(yàn)證,我們注意到仍然存在一個可用的Java 11的版本。
Shell
$ update-alternatives --list java
/usr/lib/jvm/jdk-11.0.3+7/bin/java
通過update-alternatives命令進(jìn)行移除。
Shell
$ sudo update-alternatives --remove "java" /usr/lib/jvm/jdk-11.0.3+7/bin/java
update-alternatives: removing manually selected alternative - switching java to auto mode
通過update-alternatives命令進(jìn)行驗(yàn)證,它已經(jīng)移除了。
Shell
$ update-alternatives --list java
update-alternatives: error: no alternatives for java
但是,它并沒有從文件系統(tǒng)中刪除,需要導(dǎo)航到/usr/lib/jvm 目錄,然后刪除 JDK的目錄。
Shell
$ sudo rm -rf jdk-11.0.3+7/
剩下要做的就是移除 IntelliJ 安裝的 JDK。它們位于home目錄下的.jdks中。導(dǎo)航到你的Home目錄并移除.jdks目錄。
Shell
$ rm -rf .jdks/
7.設(shè)置IntelliJ的JDK
打開 IntelliJ 導(dǎo)航到File – Project Structure,這也是配置 JDK 的位置。有點(diǎn)奇怪的是,它位于Project Structure下面,而不是通常的Settings目錄下。通過點(diǎn)擊 + 符號,你可以添加 SDKMAN JDK。
你還需要為自己的工程選擇JDK。
構(gòu)建你的工程,在日志中,你會注意到正在使用 SDKMAN JDK。
8.結(jié)論
SDKMAN 是一個可以用來控制不同版本且使用簡單的工具,很有必要成為你開發(fā)工具包的一部分。它降低了我系統(tǒng)的混亂程度,讓我可以很容易地控制系統(tǒng)里的不同版本。此外,還可以使用upgrade命令來檢查是否有新的版本。
譯者介紹
胥磊,51CTO社區(qū)編輯,某頭部電商技術(shù)副總監(jiān),關(guān)注Java后端開發(fā),技術(shù)管理,架構(gòu)優(yōu)化,分布式開發(fā)等領(lǐng)域。
原文標(biāo)題:??How to Manage Your JDKs With SDKMAN??,作者:Gunter Rotsaert