Switch between multiple java versions
While installing Android Studio on Ubuntu 14.04 I get the message that my Java version (javac 1.7.0_79) is causing problems. I found a solution of how to install a newer Oracle version of Java:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installerHowever I'm afraid that this might overwrite my existing open-jdk version of Java. Since I don't know which of my programs depend on Java, I fear that this could crash these other programs.
Is there a way to make sure apt-get doesn't overwrite my previous Java? I would basically like to have installed both and be able to switch between them manually, depending on what version I need.
6 Answers
Apt-get won't overwrite the existing java versions.
To switch between installed java versions, use the update-java-alternatives command.
List all java versions:
update-java-alternatives --listSet java version as default (needs root permissions):
sudo update-java-alternatives --set /path/to/java/version...where /path/to/java/version is one of those listed by the previous command (e.g. /usr/lib/jvm/java-7-openjdk-amd64).
Additional information:
update-java-alternatives is a convenience tool that uses Debian's alternatives system (update-alternatives) to set a bunch of links to the specified java version (e.g. java, javac, ...).
Use
sudo update-alternatives --config javawhich lists all installed versions with current active one marked and provides dialog to switch:
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: Use
export JAVA_HOME="$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')"to set $JAVA_HOME from current active version
Configuring Java
You can configure which version is the default for use in the command line by using update-alternatives, which manages which symbolic links are used for different commands.
sudo update-alternatives --config javaThe output will look something like the following.
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:You can now choose the number to use as a default. This can also be done for other Java commands, such as the compiler (javac), the documentation generator (javadoc), the JAR signing tool (jarsigner), and more. You can use the following command, filling in the command you want to customize.
sudo update-alternatives --config commandSetting the JAVA_HOME Environment Variable
Many programs, such as Java servers, use the JAVA_HOME environment variable to determine the Java installation location.
Copy the path from your preferred installation and then open /etc/environment using Sublime Text or your favourite text editor.
sudo subl /etc/environmentAt the end of this file, add the following line, making sure to replace the highlighted path with your own copied path.
JAVA_HOME="/usr/lib/jvm/java-8-oracle"Save and exit the file, and reload it: source /etc/environment.
You can now test whether the environment variable has been set by executing the following command: echo $JAVA_HOME. This will return the path you just set.
Based on the answer from @muet, I found this to work seamlessly:
Add this to ~/.bashrc:
export JAVA_HOME="$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')"Add to aliases:
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'Then you can switch within the same shell using only: useJava7or useJava8
jrunscriptmay not be available in future releases, so safe choice is using export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) as suggested by @ThiamTeck.
Also .bashrc needs to be executed every time you change your java version using update-alternative command.
Consider also using the GUI tool galternatives available through the ubuntu package manager.