Switch between multiple java versions
Solution 1
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 --list
Set 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
, ...).
Solution 2
Use
sudo update-alternatives --config java
which 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
Solution 3
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 java
The 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 command
Setting 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/environment
At 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.
Solution 4
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: useJava7
or useJava8
Related videos on Youtube
mcExchange
Updated on September 18, 2022Comments
-
mcExchange almost 2 years
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-installer
However 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. -
Joel Peltonen almost 8 yearsFor me this caused java -version to be java8, but JAVA_HOME was still set to 7 :(
-
Konstantin Zyubin over 6 yearsto make aliases permanent one can put them in ~/.bashrc , more info here askubuntu.com/questions/17536/…
-
Prakash P over 6 yearsE: Unable to locate package oracle-java7-set-default
-
brianjohnsen over 6 yearsThe unequivocally easiest way to install, use, and switch between different java versions is using SDKMAN! See here: sdkman.io/usage.html
-
chrizonline over 5 yearstq this solve my problem too. @Nenotlep what I did is edit the environment variable manually either in .bashrc or /etc/environment
-
nofinator over 5 years
update-java-alternatives
wasn't available for me. I just replaced that command withupdate-alternatives java
. -
danzel over 5 years@nofinator that only affects the
java
executable. Which Ubuntu version do you use? -
janb over 5 years@Nenotlep in order to change
JAVA_HOME
you have to run the following command:source /etc/environment
-
ThiamTeck over 5 yearsrecently come across another command to set the JAVA_HOME, yet to try on
.bashrc
:export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
-
Premek Brada over 5 yearsAs noted by @danzel at the accepted answer, this affects only the
java
executable, not the other parts of the configuration. Useupdate-java-alternatives
if available. -
Stewart over 4 yearsUsing this command, you have to update each of java, javac & jrunscript separately.
-
Samuel Owino about 4 years@janb you should edit this answer, as above won't work without your additional input.
-
danzel about 4 years@janb I honestly don't understand why this would have any effect unless you manually specified
JAVA_HOME
in/etc/environment
. I just switched back and forth between java 8 and 11, and there is still noJAVA_HOME
in/etc/environment
. In fact, it is set nowhere in my environment. I therefor rejected the suggested edit. If there are circumstances in which the suggested command is needed, please suggest a new edit and explain when and why it would be necessary. -
Giszmo about 4 yearsMy
$JAVA_HOME
is unaffected by any of the proposed commands, too. My~/.bashrc
has a lineexport JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:bin/javac::")
though and that does the trick for me:source ~/.bashrc
. If your~/.bashrc
doesn't have that line, run directlyexport JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:bin/javac::")
. -
GilbertS over 3 yearsoracle-java package does not exist. Use openjdk-8-jdk docs.datastax.com/en/jdk-install/doc/jdk-install/…
-
Akhil almost 3 yearsThis easily did the work in my PopOS! Thanks a lot @danzel