簡體   English   中英

如何在我的機器上同時安裝多個版本的 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符號鏈接就已經指向了正確的版本。

問題

重新安裝上述 JDK 版本后,我嘗試在 IntelliJ IDEA 中指向這些安裝。 但它抱怨錯誤“ 所選目錄不是 JDK 的有效主目錄”。 我在網上找到了很多關於這個問題和類似問題的資源,但這些解決方案對我的情況沒有幫助。 此外, /usr/bin中各種 Java 可執行文件的符號鏈接指向了/etc/alternatives指令的混亂。

解決方案

顯然,Oracle 發布的 RPM 腳本傾向於通過從舊安裝(例如tools.jarrt.jar中刪除關鍵 JAR 文件來破壞您安裝的任何以前的 JDK 版本。 這使得以前運行的 JDK 對開發人員毫無用處。

我的第一個反應是在運行第二個安裝程序腳本之前重命名安裝目錄。 但是這樣做會使 RPM 抱怨在運行第二個腳本時已經安裝了一個 JDK 版本。 所以hack的hack是安裝一個版本,重命名那個目錄,然后用RPM“刪除”那個版本(即使它會抱怨找不到任何與之相關的相應文件)。 然后您可以自由安裝第二個版本,為每個版本重復前面的步驟,直到安裝到您想要安裝的最新版本。

TL; 博士

以下是在同一台機器上獲取多個工作 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 版本

更新替代品 --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

替代方案是管理 jdks 的好方法,但如果您正在尋找一種簡單的方法來管理 JDK、Maven、Gradle 等的多個版本,您可以使用SDKMAN 例如為了安裝JDK只需輸入
sdk install java在您的終端中sdk install java
並切換到其他版本只需輸入:
sdk default java version

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM