共计 4507 个字符,预计需要花费 12 分钟才能阅读完成。
导读 | 在本博客中,你将学习到如何使用 SDKMAN 管理 Linux 系统上的几个 Java 开发工具包 (JDK)。此外,除了 JDK,一些软件开发工具包(SDK) 也可以通过 SDKMAN 去管理。 |
不久前,我的一位同事向我展示了他是如何使用 SDKMAN,以及如何轻松在他的 Linux 系统上维护不同版本的 JDK、Maven 等等。我以前听说过 SDKMAN,当时没有花时间去仔细研究,不过现在我已经掌握了它的使用方法。
在开始使用 SDKMAN 之前,我查看了我的 Linux 上 JDK 的版本(使用的是 Ubuntu 20.04.4 LTS 版本)。
首先,我查了下 update-alternatives 命令返回的 Java 版本的列表。发现我的系统里有两个 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,这些可以在你系统的 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 |
所以结论就是:我已经把系统搞的一团糟了。现在,让我们看看 SDKMAN 是否能够帮助我去清理系统环境,并删除所有冗余的 JDK。
SDKMAN 的安装非常简单,只需要执行以下的命令:
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//.sdkman/bin/sdkman-init.sh" | |
Then issue the following command: | |
sdk help | |
Enjoy!!! |
通过 source 命令读取和执行所需要的初始化文件里的命令:
Shell | |
source "/home//.sdkman/bin/sdkman-init.sh" |
您可以通过请求 SDKMAN 的版本来验证安装是否成功。
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 安装的全部内容。
您可以通过查看网站或者执行 list 命令来了解哪些工具包可以通过 SDKMAN 进行安装。您也可以重新通过 less 这个基本命令进行分页来翻阅和搜索列表。
Shell | |
$ sdk list |
可以通过 list 命令后缀 java 参数来获取更详细的 JDK 可用版本列表,当然这些可用的 JDK 也可以在网站上找到。此外也可以重新通过 less 命令进行分页输出。
Shell | |
$ sdk list java |
首先,我将要核实系统中默认使用的是哪个版本的 Java。看来我使用的是 AdoptOpenJDK 11.0.3 版本,这个比我预想的要老。
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. |
再次验证下默认的 Java 的版本号,它已经更改为你刚刚安装的版本。
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) |
当然也可以通过同样的方式安装 JDK 11 LTS 版本。最后问题来了,你是否希望这个 JDK 成为默认版本? 当然不是了,JDK 17 才是最新 LTS 版本,理应作为默认版本。
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 |
如果您改变初衷,仍然希望使用 JDK 11 作为默认版本,那么您可以使用 default 命令来实现这一点。
Shell | |
$ sdk default java 11.0.14-tem | |
Default java version set to 11.0.14-tem |
对此验证一下:
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) |
然后把它重新设置为 JDK 17。
Shell | |
$ sdk default java 17.0.2-tem | |
Default java version set to 17.0.2-tem |
当然也可以仅通过在终端回话中使用 use 命令来更改默认的 JDK。
Shell | |
$ sdk use java 11.0.14-tem | |
Using java version 11.0.14-tem in this shell. |
在这个命令窗口中,看到当前使用的 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) |
打开另一个终端窗口,发现 JDK 版本仍然是 JDK 17。需要注意的是,JAVA_HOME 环境变量也是指向正确的 Java 版本。
Shell | |
$ echo $JAVA_HOME | |
/home//.sdkman/candidates/java/current |
当前的 JDK 已经是通过 SDKMAN 安装的,是时候清除系统中的其他 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 命令进行验证,我们注意到仍然存在一个可用的 Java 11 的版本。
Shell | |
$ update-alternatives --list java | |
/usr/lib/jvm/jdk-11.0.3+7/bin/java |
通过 update-alternatives 命令进行移除。
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 命令进行验证,它已经移除了。
Shell | |
$ update-alternatives --list java | |
update-alternatives: error: no alternatives for java |
但是,它并没有从文件系统中删除,需要导航到 /usr/lib/jvm 目录,然后删除 JDK 的目录。
Shell | |
$ sudo rm -rf jdk-11.0.3+7/ |
剩下要做的就是移除 IntelliJ 安装的 JDK。它们位于 home 目录下的.jdks 中。导航到你的 Home 目录并移除.jdks 目录。
Shell | |
$ rm -rf .jdks/ |
打开 IntelliJ 导航到 File – Project Structure,这也是配置 JDK 的位置。有点奇怪的是,它位于 Project Structure 下面,而不是通常的 Settings 目录下。通过点击 + 符号,你可以添加 SDKMAN JDK。
你还需要为自己的工程选择 JDK。
构建你的工程,在日志中,你会注意到正在使用 SDKMAN JDK。
SDKMAN 是一个可以用来控制不同版本且使用简单的工具,很有必要成为你开发工具包的一部分。它降低了我系统的混乱程度,让我可以很容易地控制系统里的不同版本。此外,还可以使用 upgrade 命令来检查是否有新的版本。
