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

背景

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

问题

重新安装上述JDK版本后,我尝试在IntelliJ IDEA中指向这些安装。 但它抱怨错误“ 所选目录不是JDK的有效主页 ”。 我在网上找到了很多关于这个问题和类似问题的资源,但这些解决方案都没有对我的情况有所帮助。 此外, /usr/bin用于各种Java可执行文件的符号链接指向/etc/alternatives指令的大火。

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

我的第一个响应是在运行第二个安装程序脚本之前重命名安装目录。 但这样做会让RPM抱怨在运行第二个脚本时已经安装了JDK版本。 因此黑客入侵是安装一个版本,重命名该目录,然后用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,$0)}' 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