Here’s a handy howto on installing Oracle JDK™ 1.8 on modern Debian and Ubuntu distros.

Oracle does not provide *.deb packages or an APT repository for easy installation of their JDK, and it is a bit of a hassle to setup all the bits and pieces just right so that the Oracle JDK tools are properly integrated into a Debian or Ubuntu installation.

By following the steps below you’ll be able to switch between any installed JDKs, including OpenJDK versions, with a single command.

1) Download Oracle JDK

You can download Oracle JDK from this page. Look for the heading “Java SE Development Kit 8u102”, accept the license agreement and download the tarball file jdk-8u102-linux-x64.tar.gz. Update 102 was the latest at the time of writing this blog, it might be different when you read this. Remember to substitue the actual number everywhere.

Copy the file to the machine you want to install it on. We’ll assume the file is in /tmp.

2) Unpack the tarball

Next, unpack the tarball to the right place under /usr/lib/jvm.

sudo mkdir -p /usr/lib/jvm
sudo tar -x -C /usr/lib/jvm -f /tmp/jdk-8u102-linux-x64.tar.gz

Unpacking will create the directory jdk1.8.0_102 under /usr/lib/jvm.

3) Create the .jinfo file

The jinfo file is a kind of manifest of executables bundled in the JDK. Go ahead and create the file /usr/lib/jvm/.jdk1.8.0_102.jinfo with the contents below. Note the leading “.” in the filename, it is important!

4) Update Permissions

Let’s fix the permissions on all the files before moving on:

sudo chown -R root:root /usr/lib/jvm/.jdk1.8.0_102.jinfo /usr/lib/jvm/jdk1.8.0_102

5) Update Alternatives

Next we’ll use the update-alternatives command to register all the java executables. These will create symlinks for each of them. To do this, run the following commands:

6) Update Java Alternatives

Finally, use the update-java-alternatives command (which you may need to install explicitly first) to point all the java executable symlinks to the right version’s java executables.

sudo apt-get -yq install java-common
sudo update-java-alternatives -s jdk1.8.0_102

You can check if it has been registered properly:

$ update-java-alternatives -l
jdk1.8.0_102                   180        /usr/lib/jvm/jdk1.8.0_102

You’re All Set!

You should now be able to invoke any java executable:

$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

If you have multiple versions installed, for example if you also have OpenJDK 8 also installed, you can switch between the two:

# both versions are listed as alternatives
$ update-java-alternatives -l
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
jdk1.8.0_102                   180        /usr/lib/jvm/jdk1.8.0_102

# currently using Oracle JDK 1.8
$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

# swtich to OpenJDK 8 (errors are for browser plugin and can be ignored)
$ sudo update-java-alternatives -s java-1.8.0-openjdk-amd64
update-alternatives: error: no alternatives for mozilla-javaplugin.so
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so

# now using OpenJDK 8
$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)