在多个Java版本之间切换

在Ubuntu 14.04上安装Android Studio时,我收到一个消息,说我的Java版本(javac 1.7.0_79)会引起问题。我找到了一个解决方案,可以安装更新的Oracle Java版本。
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

然而,我担心这可能会覆盖我现有的Java的open-jdk版本。因为我不知道我的哪些程序依赖于Java,我担心这可能会导致其他程序崩溃。
有没有办法确保apt-get不会覆盖我以前的Java?我基本上希望两者都安装,并且能够根据需要手动切换版本。
6个回答

Apt-get不会覆盖现有的Java版本。
要在安装的Java版本之间切换,请使用"update-java-alternatives"命令。
列出所有Java版本:
update-java-alternatives --list

将Java版本设置为默认值(需要root权限):
sudo update-java-alternatives --set /path/to/java/version

其中/path/to/java/version是由先前命令列出的其中一个(例如/usr/lib/jvm/java-7-openjdk-amd64)。


附加信息: update-java-alternatives 是一个方便的工具,它使用Debian的alternatives系统update-alternatives)来设置一系列链接到指定的Java版本(例如javajavac等)。

1对我来说,这导致 java -version 显示为 java8,但 JAVA_HOME 仍然设置为 7 :( - Joel Peltonen
谢谢,这也解决了我的问题。@Nenotlep,我所做的是手动编辑环境变量,可以在.bashrc或/etc/environment中进行编辑。 - chrizonline
update-java-alternatives 对我来说不可用。我只是用 update-alternatives java 替换了那个命令。 - nofinator
@nofinator 这只影响java可执行文件。您使用的是哪个Ubuntu版本? - danzel
4@Nenotlep 要更改 JAVA_HOME,您需要运行以下命令:source /etc/environment - janb
@janb 你应该编辑这个答案,因为上面的内容没有你的额外输入是行不通的。 - Samuel Owino
1@janb,老实说,我真的不明白为什么这会有任何影响,除非你在/etc/environment中手动指定了JAVA_HOME。我刚刚在Java 8和11之间来回切换,但/etc/environment中仍然没有JAVA_HOME。事实上,在我的环境中根本没有设置它。因此,我拒绝了建议的编辑。如果有需要使用建议命令的情况,请提出新的编辑建议,并解释何时以及为什么需要这样做。 - danzel
1$JAVA_HOME不受任何提议的命令影响。然而,我的~/.bashrc文件中有一行export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:bin/javac::")可以解决问题:source ~/.bashrc。如果你的~/.bashrc文件没有这行代码,请直接运行export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:bin/javac::") - Giszmo
这个在我的PopOS上轻松完成了工作!非常感谢@danzel - Akhil

使用

sudo update-alternatives --config java

列出所有已安装的版本,并标记当前活动版本,并提供切换对话框。
There are 3 choices for the alternative java (providing /usr/bin/java).

Selection    Path...
------------------------------------------------------------
  0            /usr/lib/jvm/java-9-oracle/bin/java...
* 1            /usr/lib/jvm/java-7-oracle/jre/bin/java...
  2            /usr/lib/jvm/java-8-oracle/jre/bin/java...
  3            /usr/lib/jvm/java-9-oracle/bin/java...

Press <enter> to keep...[*], or type selection number: 

使用

export JAVA_HOME="$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')"

设置$JAVA_HOME为当前活动版本。

1正如 @danzel 在接受的答案中所指出的,这只影响到 java 可执行文件,而不涉及配置的其他部分。如果可用,可以使用 update-java-alternatives 命令进行更新。 - Premek Brada
3使用这个命令,你需要分别更新java、javac和jrunscript。 - Stewart

配置Java

你可以通过使用update-alternatives来配置命令行中默认使用的Java版本,它管理不同命令所使用的符号链接。

sudo update-alternatives --config java

输出将类似于以下内容。
There are 5 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      auto mode
  1            /usr/lib/jvm/java-6-oracle/jre/bin/java          1         manual mode
  2            /usr/lib/jvm/java-7-oracle/jre/bin/java          2         manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
  4            /usr/lib/jvm/java-8-oracle/jre/bin/java          3         manual mode
  5            /usr/lib/jvm/java-9-oracle/bin/java              4         manual mode

Press <enter> to keep the current choice[*], or type selection number:

现在您可以选择一个数字作为默认值。这也适用于其他Java命令,例如编译器(javac),文档生成器(javadoc),JAR签名工具(jarsigner)等等。您可以使用以下命令,填写您想要自定义的命令
sudo update-alternatives --config command

设置JAVA_HOME环境变量

许多程序,如Java服务器,使用JAVA_HOME环境变量来确定Java安装位置。

从您首选的安装路径中复制路径,然后使用Sublime Text或您喜欢的文本编辑器打开/etc/environment文件。

sudo subl /etc/environment

在文件末尾添加以下行,确保将高亮路径替换为您自己复制的路径。
JAVA_HOME="/usr/lib/jvm/java-8-oracle"

保存并退出文件,然后重新加载它:source /etc/environment。 现在,您可以通过执行以下命令来测试环境变量是否已设置:echo $JAVA_HOME。这将返回您刚刚设置的路径。

这不会改变Java编译器javac的版本 - undefined

根据@muet的答案,我发现这个方法可以无缝运行:
将以下内容添加到~/.bashrc文件中:
export JAVA_HOME="$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')"

添加到别名中:
alias useJava8='yes | sudo apt-get install oracle-java8-set-default && source ~/.bashrc'
alias useJava7='yes | sudo apt-get install oracle-java7-set-default && source ~/.bashrc'

然后你可以在同一个shell中只使用useJava7useJava8来切换。

要使别名永久生效,可以将它们放在~/.bashrc文件中。这里有更多信息:https://askubuntu.com/questions/17536/how-do-i-create-a-permanent-bash-alias - Konstantin Zyubin
无法找到软件包oracle-java7-set-default。 - Prakash P
1安装、使用和切换不同的Java版本最简单的方法无疑是使用SDKMAN!请参考:http://sdkman.io/usage.html - brianjohnsen
最近发现另一个设置JAVA_HOME的命令,但尚未在.bashrc上尝试:export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) - ThiamTeck
oracle-java软件包不存在。请使用openjdk-8-jdk。https://docs.datastax.com/en/jdk-install/doc/jdk-install/installOpenJdkDeb.html - GilbertS

考虑一下通过Ubuntu软件包管理器使用GUI工具galternatives

jrunscript可能在未来的版本中不再可用,所以安全选择是使用 export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))),如@ThiamTeck建议的那样。 此外,每次使用update-alternative命令更改Java版本时,需要执行.bashrc