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

Jon*_*rum 3 java linux rpm

背景

我的工作主要是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指令的大火.

Jon*_*rum 7

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

我的第一个响应是在运行第二个安装程序脚本之前重命名安装目录.但这样做会让RPM抱怨在运行第二个脚本时已经安装了JDK版本.所以hack的黑客就是安装一个版本,重命名该目录,然后用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
Run Code Online (Sandbox Code Playgroud)

2.重命名安装目录:

:~# mv /usr/java/jdk1.5.0_22 /usr/java/jdk1.5.0_22-bak
Run Code Online (Sandbox Code Playgroud)

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

:~# rpm -e jdk-2000:1.5.0_22-fcs.x86_64
Run Code Online (Sandbox Code Playgroud)

4.冲洗并重复,直到安装完所有版本

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

:~# mv /usr/java/jdk1.5.0_22-bak /usr/java/jdk1.5.0_22
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)