如何在我的机器上同时安装 Java JDK 的多个版本?

How can I have multiple versions of the Java JDK installed on my machine at the same time?

背景

我在工作中主要使用 Java 和 Scala,但我们的许多遗留代码尚未更新到最新的 JDK。因此,我们必须在开发机器上安装 JDK 版本 5、6、7 和 8。直到最近,我一直在使用 Arch Linux,但我刚刚切换到 OpenSuse Tumbleweed。我用来安装 JDK 版本的方法是从 Oracle 网站下载 RPM 安装程序脚本,并从 1.5 开始安装它们,然后逐步升级到 1.8,这样 /usr/java/latest 符号 link 已经指向正确的版本。

问题

重新安装上述 JDK 版本后,我试图在 IntelliJ IDEA 中指向这些安装。但它抱怨错误“The selected directory is not a valid home for JDK”。我在网上找到了很多关于这个问题和类似问题的资源,但是 none 这些解决方案对我的情况有所帮助。此外,/usr/bin 中用于各种 Java 可执行文件的符号 links 指向 /etc/alternatives 指令的冲突。

解决方案

显然,Oracle 发布的 RPM 脚本往往会破坏您安装的任何以前的 JDK 版本,方法是从那些较旧的安装中删除关键 JAR 文件,例如 tools.jar 和 [=17] =].这使得以前正常运行的 JDK 对开发人员毫无用处。

我的第一反应是在 运行 第二个安装程序脚本之前重命名安装目录。但是这样做会使 RPM 抱怨在 运行 第二个脚本时已经安装了 JDK 的一个版本。所以 hack of the hack 是安装一个版本,重命名该目录,然后 "remove" 带有 RPM 的那个版本(即使它会抱怨无法找到任何与之关联的相应文件)。 然后您可以自由安装第二个版本,对每个版本重复前面的步骤,直到获得您要安装的最新版本。

TL;DR

以下是在同一台机器上获得多个工作 JDK 版本的步骤:

1.使用安装程序脚本安装 JDK 的第一个版本:

:~# chmod a+x jdk-1_5_0_22-linux-amd64-rpm.bin
:~# ./jdk-1_5_0_22-linux-amd64-rpm.bin -x
:~# rpm -ivh --replacepkgs jdk-1_5_0_22-linux-amd64.rpm

2。重命名安装目录:

:~# mv /usr/java/jdk1.5.0_22 /usr/java/jdk1.5.0_22-bak

3。使用 RPM 卸载该版本的 JDK:

:~# rpm -e jdk-2000:1.5.0_22-fcs.x86_64

4。冲洗并重复直到安装所有版本

5.删除目录名称末尾的 -bak

:~# mv /usr/java/jdk1.5.0_22-bak /usr/java/jdk1.5.0_22

6.将 /usr/java 符号链接更改为正确的目标:

:~# ls -la /usr/java
default -> java7
java5 -> jdk1.5.0_22
java6 -> jdk1.6.0_45
java7 -> jdk1.7.0_80
java8 -> jdk1.8.0_101
jdk1.5.0_22
jdk1.6.0_45
jdk1.7.0_80
jdk1.8.0_101
latest -> java8

7.将 /usr/bin 符号链接更改为正确的目标:

:~# ls -la /usr/bin/ja*
jar -> /usr/java/default/bin/jar
java -> /usr/java/default/bin/java
javac -> /usr/java/default/bin/javac
javadoc -> /usr/java/default/bin/javadoc
javah -> /usr/java/default/bin/javah
javaws -> /usr/java/default/bin/javaws

在 ubuntu/linux 上,您可以使用

切换 java 版本

update-alternatives --config java

但在此之前,您需要安装版本。

您可以使用此脚本 (./install-java.sh) 安装多个 JVM

#!/bin/sh
(
lookforJdks=$PWD
echo "Directory: $lookforJdks"
jdks=`test -e ./javac || find $lookforJdks -type d -iname '*jdk1.*' 2> /dev/null`
#set -e
echo 'which jdk do you want to choose? looking for jdks. This might take a while'
echo "$jdks" | awk '{printf("%5d : %s\n", NR,[=10=])}'
read choose
test -e ./javac || cd `echo "$jdks" | tr '\n' ',' | cut -d',' -f $choose`/bin
for e in appletviewer extcheck idlj jar jarsigner java javac javadoc javah javap jconsole \
 jdb jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd native2ascii rmic \
 schemagen serialver wsgen wsimport xjc jvisualvm jmc; do sudo update-alternatives \
 --install /usr/bin/$e $e $(readlink -f ./$e) 100; done
)

echo "RUN update-alternatives --config java"

将此脚本放在已解压 JVM 的文件夹中,运行:

/opt/install-java.sh

下次使用:update-alternatives --config java

备选方案是管理 jdks 的好方法,但如果您正在寻找一种简单的方法来管理 JDK、Maven、Gradle 的多个版本,...您可以使用 SDKMAN。 例如为了安装 JDK 只需输入
sdk install java 在您的终端中。
并切换到其他版本只需输入:
sdk默认java<strong><em>版本</em></strong>