有一个工具叫SDKMan,它允许我们这样做。官方网站这样描述:
TIP: "SDKMan 是一个工具,用于在大多数基于Unix的系统上管理多个软件开发工具包的并行版本。它提供了一个方便的命令行接口(CLI)和API,用于安装、切换、删除和列出候选项。”
使用SDKMan的一些要点如下:
修改 /etc/profile
文件
最后面添加:
#wjw_add for global SDKMan
export SDKMAN_DIR="/usr/local/sdkman"
[[ -s "$SDKMAN_DIR/bin/sdkman-init.sh" ]] && source "$SDKMAN_DIR/bin/sdkman-init.sh"
执行: source /etc/profile
来生效!
下载sdkman:
curl -s "https://get.sdkman.io" | bash
#或者通过代理: curl --proxy http://127.0.0.1:8118 "https://get.sdkman.io" | bash
#或者设置环境变量: export https_proxy=http://127.0.0.1:8118/
激活sdkman:
source "$SDKMAN_DIR/bin/sdkman-init.sh"
SDKMan支持为JVM安装29个软件开发工具包,例如Java、Groovy、Scala、Kotlin、Ceylon、Ant、Gradle、Grails、Maven、Gradle、SBT、Spark和Spring Boot。我们可以使用sdk list
命令获得完整的列表。
命令sdk list java
将给我们一个java版本列表,我们可以使用SDKMan安装,如下所示:
$ sdk list java
================================================================================
Available Java Versions
================================================================================
13.ea.02-open 1.0.0-rc-10-grl
12.ea.26-open 1.0.0-rc-9-grl
11.0.2-zulu 1.0.0-rc-8-grl
11.0.2-open
11.0.1-zulufx
10.0.2-zulu
10.0.2-open
9.0.7-zulu
9.0.4-open
8.0.202-amzn
8.0.201-zulu
8.0.201-oracle
8.0.192-zulufx
7.0.181-zulu
1.0.0-rc-11-grl
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
现在,假设我们想安装OpenJDK版本的Java v9。然后,我们将在终端中执行下面的命令,该命令还将更新 PATH
和JAVA_HOME
变量:
$ sdk install java 9.0.4-open
该命令将花费一些时间来执行,因为它将下载JDK到我们机器上,该命令将输出如下内容:
Downloading: java 9.0.4-open
In progress...
######################################################################## 100.0%
Repackaging Java 9.0.4-open...
Done repackaging...
Cleaning up residual files...
Installing: java 9.0.4-open
Done installing!
Setting java 9.0.4-open as default.
现在,如果我们检查Java版本和JAVA_HOME,可以看到Java已经更新到9.0.4
$ java -version
openjdk version "9.0.4"
OpenJDK Runtime Environment (build 9.0.4+11)
OpenJDK 64-Bit Server VM (build 9.0.4+11, mixed mode)
$ echo $JAVA_HOME
/usr/local/sdkman/candidates/java/current
我们可以按照相同的过程来安装上面列表中看到的任何版本。让我们假设要安装Java 11版本。然后,我们可以执行命令:
$ sdk install java 11.0.2-open
Downloading: java 11.0.2-open
In progress...
######################################################################## 100.0%
Repackaging Java 11.0.2-open...
Done repackaging...
Cleaning up residual files...
Installing: java 11.0.2-open
Done installing!
Do you want java 11.0.2-open to be set as default? (Y/n): Y
Setting java 11.0.2-open as default.
现在,如果我们再次检查我们的Java版本和JAVA_HOME,我们可以看到Java已经更新到11.0.2:
$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
$ echo $JAVA_HOME
/usr/local/sdkman/candidates/java/current
WARNING: 注意:有时,您需要关闭并重新打开终端才能看到更改。
首先,我们需要找出机器上先前已经安装了Java的位置。在我的机器上,它安装在文件夹 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.345.b01-1.el7_9.x86_64
下。让我们通过指定本地安装的路径来设置本地版本:
#可是使用find先查找到具体位置,例如: find /usr -name java
sdk install java 8.0.345 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.345.b01-1.el7_9.x86_64
现在,如果我们再次执行sdk list java
命令,我们将得到:
================================================================================
Available Java Versions for Linux 64bit
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Corretto | | 20 | amzn | | 20-amzn
| | 19.0.2 | amzn | | 19.0.2-amzn
| | 19.0.1 | amzn | | 19.0.1-amzn
| | 17.0.6 | amzn | | 17.0.6-amzn
| | 17.0.5 | amzn | | 17.0.5-amzn
| | 11.0.18 | amzn | | 11.0.18-amzn
| | 11.0.17 | amzn | | 11.0.17-amzn
| | 8.0.362 | amzn | | 8.0.362-amzn
| | 8.0.352 | amzn | | 8.0.352-amzn
Dragonwell | | 17.0.6 | albba | | 17.0.6-albba
| | 17.0.5 | albba | | 17.0.5-albba
| | 17.0.4 | albba | | 17.0.4-albba
| >>> | 11.0.18 | albba | installed | 11.0.18-albba
| | 11.0.17 | albba | | 11.0.17-albba
| | 11.0.16 | albba | | 11.0.16-albba
| | 8.0.362 | albba | | 8.0.362-albba
| | 8.0.352 | albba | | 8.0.352-albba
| | 8.0.345 | albba | | 8.0.345-albba
Gluon | | 22.1.0.1.r17 | gln | | 22.1.0.1.r17-gln
| | 22.1.0.1.r11 | gln | | 22.1.0.1.r11-gln
Unclassified | | 8.0.345 | none | local only | 8.0.345
================================================================================
>>> - currently in use
================================================================================
我们可以清楚地看到,我们的机器上已经安装了2个JDK,并且JDK 11.0.18-albba
目前正在使用。但是,如果我们想在它们之间切换或者安装一个新的,我们可以通过使用**sdk use java <version_which_you_want_to_use>
**就能非常容易地做到这一点,如下所示:
$ sdk use java 8.0.345
Using java version 8.0.345 in this shell.
$ java -version
openjdk version "1.8.0_345"
OpenJDK Runtime Environment (build 1.8.0_345-b01)
OpenJDK 64-Bit Server VM (build 25.345-b01, mixed mode)
$ sdk use java 11.0.18-albba
Using java version 11.0.18-albba in this shell.
$ java -version
openjdk version "11.0.18.14" 2023-01-17
OpenJDK Runtime Environment (Alibaba Dragonwell Standard Edition)-11.0.18.14+9-GA (build 11.0.18.14+9)
OpenJDK 64-Bit Server VM (Alibaba Dragonwell Standard Edition)-11.0.18.14+9-GA (build 11.0.18.14+9, mixed mode)
TIP: 使用
sdk use
命令只能使您在执行sdk use
命令的终端shell中使用指定版本的JDK。如果您关闭终端并再次打开它,您将使用先前安装的版本。
但是如果您想为所有终端和应用程序激活一个版本的JDK,您可以使用命令**sdk default java <your_version>
*
$ sdk default java 11.0.18-albba
Default java version set to 11.0.18-albba
$ java -version
openjdk version "11.0.18.14" 2023-01-17
OpenJDK Runtime Environment (Alibaba Dragonwell Standard Edition)-11.0.18.14+9-GA (build 11.0.18.14+9)
OpenJDK 64-Bit Server VM (Alibaba Dragonwell Standard Edition)-11.0.18.14+9-GA (build 11.0.18.14+9, mixed mode)
或者,您可以卸载该版本并重新安装它,如下所示,这将把该版本设置为当前JDK。
如果你想卸载任何JDK版本,例如11.0.18-albba,你可以这样做:
$ sdk uninstall 11.0.18-albba
而且,如果您想再次安装卸载后的版本,您可以重新安装它,而且这一次,SDKMan不会下载它,因为它已经在您的机器上安装了它(如果您不手动删除它)。
$ sdk install 11.0.18-albba
Found a previously downloaded java 11.0.18-albba archive. Not downloading it again...
Installing: java 11.0.18-albba
Done installing!
Do you want java 11.0.18-albba to be set as default? (Y/n): y
Setting java 111.0.18-albba as default.
先删除
rm -r -f ${SDKMAN_DIR}
最后一步删除 ~/.zshrc
, ~/.bash_profile
, /etc/profile
文件中的初始化代码段