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

如何在我的机器上同时安装多个版本的Java JDK? 背景,java,linux,rpm,Java,Linux,Rpm,在我的工作中,我主要使用Java和Scala,但我们的许多遗留代码尚未更新到最新的JDK。因此,我们必须在开发机器上安装JDK版本5、6、7和8。直到最近,我一直在使用ArchLinux,但我只是切换到OpenSuse Tumbleweed。我用来安装JDK版本的方法是从Oracle网站下载RPM安装程序脚本,并从1.5开始安装,一直安装到1.8,这样/usr/java/latest符号链接就已经指向了正确的版本 问题 在重新安装上述JDK版本后,我试图在IntelliJ IDEA中指出这些安装

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

问题 在重新安装上述JDK版本后,我试图在IntelliJ IDEA中指出这些安装。但它抱怨错误为“”。我在网上找到了很多关于这个问题和类似问题的资源,但这些解决方案对我的情况都没有帮助。此外,各种Java可执行文件的
/usr/bin
中的符号链接指向了
/etc/alternations
指令的冲突。

显然,Oracle发布的RPM脚本倾向于通过从那些较旧的安装(如
tools.JAR
rt.JAR
)中删除关键JAR文件的方式来破坏您以前安装的任何JDK版本。这使得以前运行的JDK对开发人员来说毫无用处

我的第一个响应是在运行第二个安装程序脚本之前重命名安装目录。但这样做让RPM抱怨在运行第二个脚本时已经安装了JDK版本。因此,黑客的攻击是安装一个版本,重命名该目录,然后用RPM“删除”该版本(即使它会抱怨找不到与之相关的任何文件)。然后,您可以自由安装第二个版本,对每个版本重复前面的步骤,直到获得要安装的最新版本

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

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

2。重命名安装目录:

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

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

5。从目录名末尾删除
-bak

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

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


在ubuntu/linux上,您可以使用

更新备选方案——配置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


下一个用法:更新备选方案——配置java备选方案是管理JDK的好方法,但是如果您正在寻找一种简单的方法来管理多个版本的JDK、Maven、Gradle。。。你可以用。 例如,为了安装JDK,只需输入
sdk在终端中安装java

要切换到其他版本,只需输入:

sdk默认java版本

,仍然无法解决Oracle安装程序包破坏以前版本的问题。它实际上也不能解决所问的问题。此解决方案只涉及引用哪个版本的
/usr/bin/java
。我指定直接从IDE中使用哪个JDK,因此符号链接
/usr/bin/java
是不相关的。问题是旧的JDK在安装了新的JDK之后就变得无用了。因此,我发布了clusterfuck解决方案。
updatealternations
不会更新
JAVA\u HOME
JRE\u HOME
,而且
JRE/bin
中有多个二进制文件要在
PATH
中更新
更新alternations
是处理多个JDK的糟糕方法。你是在建议我每次切换项目时都必须运行
updatealternations
?SDKMAN项目看起来很有趣,但问题不在于命令提示符认为哪个版本是默认Java;问题在于安装了多个开发版本。这不是关于运行Java,而是关于用Java开发。
:~# mv /usr/java/jdk1.5.0_22 /usr/java/jdk1.5.0_22-bak
:~# rpm -e jdk-2000:1.5.0_22-fcs.x86_64
:~# mv /usr/java/jdk1.5.0_22-bak /usr/java/jdk1.5.0_22
:~# 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
:~# 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
#!/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"