1. Información general
En este tutorial, presentaremos diferentes métodos para instalar un JDK en Ubuntu . Luego, compararemos brevemente los métodos. Finalmente, mostraremos cómo administrar múltiples instalaciones de Java en un sistema Ubuntu.
Como requisito previo para cada método, necesitamos
- un sistema Ubuntu
- iniciar sesión como usuario no root con privilegios de sudo
Las instrucciones que se describen a continuación se han probado en Ubuntu 18.10, 18.04 LTS, 16.04 LTS y 14.04 LTS. Para Ubuntu 14.04 LTS, existen algunas diferencias, que se mencionan en el texto.
Tenga en cuenta que tanto los paquetes que puede descargar de OpenJDK y Oracle como los paquetes disponibles en los repositorios se actualizan periódicamente. Los nombres exactos de los paquetes probablemente cambiarán dentro de algunos meses, pero los métodos básicos de instalación seguirán siendo los mismos.
2. Instalación de JDK 11
Si queremos utilizar la última y mejor versión de JDK, a menudo la instalación manual es el camino a seguir. Esto significa descargar un paquete desde OpenJDK o el sitio de Oracle y configurarlo para que se adhiera a las convenciones de cómo apt configura los paquetes JDK.
2.1. Instalación de OpenJDK 11 manualmente
En primer lugar, descarguemos el archivo tar del OpenJDK 11 recientemente lanzado:
$ wget //download.java.net/java/ga/jdk11/openjdk-11_linux-x64_bin.tar.gz
Y comparamos la suma sha256 del paquete descargado con la proporcionada en el sitio de OpenJDK:
$ sha256sum openjdk-11_linux-x64_bin.tar.gz
Extraigamos el archivo tar :
$ tar xzvf openjdk-11_linux-x64_bin.tar.gz
A continuación, movamos el directorio jdk-11 que acabamos de extraer a un subdirectorio de / usr / lib / jvm . Los paquetes apt descritos en la siguiente sección también colocan sus JDK en este directorio:
$ sudo mkdir /usr/lib/jvm $ sudo mv jdk-11 /usr/lib/jvm/openjdk-11-manual-installation/
Ahora, queremos que los comandos java y javac estén disponibles . Una posibilidad sería crear enlaces simbólicos para ellos, por ejemplo, en el directorio / usr / bin . Pero en su lugar, instalaremos una alternativa para ambos. De esta manera, si alguna vez deseamos instalar versiones adicionales de JDK, funcionarán bien juntas:
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/openjdk-11-manual-installation/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/openjdk-11-manual-installation/bin/javac 1
Verifiquemos la instalación:
$ java -version
Como podemos ver en el resultado, de hecho hemos instalado la última versión de OpenJDK JRE y JVM:
openjdk version "11" 2018-09-25 OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
Echemos un vistazo a la versión del compilador también:
$ javac -version
javac 11
2.2. Instalación manual de Oracle JDK 11
Si queremos asegurarnos de utilizar la versión más reciente de Oracle JDK, podemos seguir un flujo de trabajo de instalación manual similar, como para OpenJDK. Para descargar el archivo tar para JDK 11 desde el sitio web de Oracle, primero debemos aceptar un acuerdo de licencia . Por esta razón, descargar a través de wget es un poco más complicado que para OpenJDK:
$ wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" \ //download.oracle.com/otn-pub/java/jdk/11.0.1+13/90cf5d8f270a4347a95050320eef3fb7/jdk-11.0.1_linux-x64_bin.tar.gz
El ejemplo anterior descarga el paquete para 11.0.1. El enlace de descarga exacto cambia para cada versión secundaria.
Los siguientes pasos son los mismos que para OpenJDK:
$ sha256sum jdk-11.0.1_linux-x64_bin.tar.gz $ tar xzvf jdk-11.0.1_linux-x64_bin.tar.gz $ sudo mkdir /usr/lib/jvm $ sudo mv jdk-11.0.1 /usr/lib/jvm/oracle-jdk-11-manual-installation/ $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle-jdk-11-manual-installation/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle-jdk-11-manual-installation/bin/javac 1
La verificación también es la misma. Pero el resultado muestra que esta vez, no hemos instalado OpenJDK sino Java (TM):
$ java -version
java version "11.0.1" 2018-10-16 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
Y para el compilador:
$ javac -version
javac 11.0.1
2.3. Instalación de Oracle JDK 11 desde un PPA
Actualmente, Oracle JDK 11 también está disponible en un PPA (archivo de paquete personal). Esta instalación consta de 2 pasos: agregar el repositorio a nuestro sistema e instalar el paquete desde el repositorio a través de apt:
$ sudo add-apt-repository ppa:linuxuprising/java $ sudo apt update $ sudo apt install oracle-java11-installer
Los pasos de verificación deben mostrar el mismo resultado que después de la instalación manual en la sección 2.2.1 .:
$ java -version
java version "11.0.1" 2018-10-16 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
Y para el compilador:
$ javac -version
javac 11.0.1
En Ubuntu 14.04 LTS, el comando add-apt-repository no está disponible de forma predeterminada. Para agregar un repositorio, primero necesitamos instalar el paquete software-properties-common .
$ sudo apt update $ sudo apt install software-properties-common
Luego, podemos continuar con add-apt-repository, apt update y apt install como se muestra arriba.
3. Instalación de JDK 8
3.1. Instalación de OpenJDK 8 en Ubuntu 16.04 LTS y versiones posteriores
JDK 8 es una versión LTS que existe desde hace un tiempo. Por esta razón, podemos encontrar una versión actualizada de OpenJDK 8 en el repositorio "Principal" en la mayoría de las versiones de Ubuntu compatibles. Por supuesto, también podemos ir al sitio web de OpenJDK, tomar un paquete allí e instalarlo de la misma manera que hemos visto en la sección anterior.
Pero el uso de las herramientas de apt y el repositorio "principal" proporciona algunos beneficios. El repositorio "Principal" está disponible de forma predeterminada en todos los sistemas Ubuntu. Tiene el respaldo de Canonical, la misma compañía que mantiene Ubuntu.
Instalemos OpenJDK 8 desde el repositorio "Principal" con apt :
$ sudo apt update $ sudo apt install openjdk-8-jdk
Ahora, verifiquemos la instalación:
$ java -version
El resultado debe incluir un entorno de ejecución y una JVM:
openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-0ubuntu0.18.04.1-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
Let's check that the javac executable is available as well:
$ javac -version
Now we should see the same version number as shown above:
javac 1.8.0_181
3.2. Installing OpenJDK 8 on Ubuntu 14.04 LTS
On Ubuntu 14.04 LTS, the OpenJDK packages aren't available in the “Main” repository, so we'll install them from the openjdk-r PPA. As we've seen in section 2.3 above, the add-apt-repository command isn't available by default. We need the software-properties-common package for it:
$ sudo apt update $ sudo apt install software-properties-common $ sudo add-apt-repository ppa:openjdk-r/ppa $ sudo apt update $ sudo apt install openjdk-8-jdk
3.3. Installing Oracle JDK 8 from a PPA
The “Main” repository does not contain any proprietary software. If we want to install Oracle Java with apt, we'll have to use a package from a PPA. We've already seen how to install Oracle JDK 11 from the linuxuprising PPA. For Java 8, we can find the packages in the webupd8team PPA.
First, we need to add the PPA apt repository to our system:
$ sudo add-apt-repository ppa:webupd8team/java
Then we can install the package the usual way:
$ sudo apt update $ sudo apt install oracle-java8-installer
During the installation, we have to accept Oracle's license agreement. Let's verify the installation:
$ java -version
The output shows a Java(TM) JRE and JVM:
java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
We can also verify that the compiler has been installed:
$ javac -version
javac 1.8.0_181
4. Installing JDK 10
The versions Java 10 and Java 9 aren't supported anymore. You can install them manually, following similar steps as in section 2. You can grab the packages from:
- //jdk.java.net/archive/
- //www.oracle.com/technetwork/java/javase/archive-139210.html
Both sites contain the same warning:
These older versions of the JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in production.
4.1. Installing OpenJDK 10 Manually
Let's see how to install OpenJDK 10.0.1:
$ wget //download.java.net/java/GA/jdk10/10.0.1/fb4372174a714e6b8c52526dc134031e/10/openjdk-10.0.1_linux-x64_bin.tar.gz $ sha256sum openjdk-10.0.1_linux-x64_bin.tar.gz $ tar xzvf openjdk-10.0.1_linux-x64_bin.tar.gz $ sudo mkdir /usr/lib/jvm $ sudo mv jdk-10.0.1 /usr/lib/jvm/openjdk-10-manual-installation/ $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/openjdk-10-manual-installation/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/openjdk-10-manual-installation/bin/javac 1 $ java -version $ javac -version
4.2. Installing Oracle JDK 10 Manually
As we've seen in section 2.2., in order to download a package from the Oracle website, we must accept a license agreement first. Contrary to the supported versions, we can't download the older Oracle JDKs via wget and a cookie. We need to head to //www.oracle.com/technetwork/java/javase/downloads/java-archive-javase10-4425482.html and download the tar.gz file. Afterward, we follow the familiar steps:
$ sha256sum jdk-10.0.2_linux-x64_bin.tar.gz $ tar xzvf jdk-10.0.2_linux-x64_bin.tar.gz $ sudo mkdir /usr/lib/jvm $ sudo mv jdk-10.0.2 /usr/lib/jvm/oracle-jdk-10-manual-installation/ $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle-jdk-10-manual-installation/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle-jdk-10-manual-installation/bin/javac 1 $ java -version $ javac -version
5. Installing JDK 9
5.1. Installing OpenJDK 9 Manually
Just like we saw above with OpenJDK 10.0.1, we download the OpenJDK 9 package via wget and set it up according to the conventions:
$ wget //download.java.net/java/GA/jdk9/9.0.4/binaries/openjdk-9.0.4_linux-x64_bin.tar.gz $ sha256sum openjdk-9.0.4_linux-x64_bin.tar.gz $ tar xzvf openjdk-9.0.4_linux-x64_bin.tar.gz $ sudo mkdir /usr/lib/jvm $ sudo mv jdk-9.0.4 /usr/lib/jvm/openjdk-9-manual-installation/ $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/openjdk-9-manual-installation/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/openjdk-9-manual-installation/bin/javac 1 $ java -version $ javac -version
5.2. Installing Oracle JDK 9 Manually
Once again, we use the same method as for JDK 10. We need to head to //www.oracle.com/technetwork/java/javase/downloads/java-archive-javase9-3934878.html and download the tar.gz file. Afterward, we follow the familiar steps:
$ sha256sum jdk-9.0.4_linux-x64_bin.tar.gz $ tar xzvf jdk-9.0.4_linux-x64_bin.tar.gz $ sudo mkdir /usr/lib/jvm $ sudo mv jdk-9.0.4 /usr/lib/jvm/oracle-jdk-9-manual-installation/ $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle-jdk-9-manual-installation/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle-jdk-9-manual-installation/bin/javac 1 $ java -version $ javac -version
6. Comparison
We've seen three different ways of installing a JDK on Ubuntu. Let's have a quick overview of each of them, pointing out the advantages and disadvantages.
6.1. “Main” Repository
This is the “Ubuntu native” way of installation. A big advantage is that we update the packages via the “usual apt workflow” with apt update and apt upgrade.
Furthermore, the “Main” repository is maintained by Canonical, which provides reasonably fast (if not immediate) updates. For example, OpenJDK versions 10.0.1 and 10.0.2 were both synced within a month of release.
6.2. PPA
PPAs are small repositories maintained by an individual developer or a group. This also means that the update frequency depends on the maintainer.
Packages from PPAs are considered riskier than the packages in the “Main” repository. First, we have to add the PPA explicitly to the system's repository list, indicating that we trust it. Afterward, we can manage the packages via the usual apt tooling (apt update and apt upgrade).
6.3. Manual Installation
We download the package directly from the OpenJDK or Oracle site. Although this method offers a great deal of flexibility, updates are our responsibility. If we want to have the latest and greatest JDK, this is the way to go.
7. Exploring Other Versions of JDKs
The examples in sections 2 and 3 reflect the current status on Ubuntu 18.04 LTS. Keep in mind that the JDKs and the corresponding packages are updated regularly. Thus it's useful to know how to explore our current possibilities.
In this section, we'll focus on surveying the OpenJDK packages in the “Main” repository. If we've already added a PPA with add-apt-repository, we can explore it in a similar manner with apt list and apt show.
To discover which PPAs are available, we can head to //launchpad.net/. If we don't find what we're looking for in the “Main” repository and in the PPAs, we'll have to fall back to manual installation.
If we'd like to use an unsupported version, even that can be difficult. As of this writing, we didn't find any packages for Java 9 or Java 10 on the OpenJDK and Oracle websites.
Let's see which other JDK packages exist in the “Main” repository:
$ apt list openjdk*jdk
On Ubuntu 18.04 LTS, we can choose between the two current LTS Java versions:
Listing... Done openjdk-11-jdk/bionic-updates,bionic-security,now 10.0.2+13-1ubuntu0.18.04.2 amd64 [installed,automatic] openjdk-8-jdk/bionic-updates,bionic-security 8u181-b13-0ubuntu0.18.04.1 amd64
It's also worth noting that although the package is called openjdk-11-jdk, as of this writing, it actually installs version 10.0.2. This is likely to change soon. We can see that if we inspect the package:
$ apt show openjdk-11-jdk
Let's have a look at the “Depends” section of the output. Note that these packages (e.g. a JRE) also get installed alongside openjdk-11-jdk:
Depends: openjdk-11-jre (= 10.0.2+13-1ubuntu0.18.04.2), openjdk-11-jdk-headless (= 10.0.2+13-1ubuntu0.18.04.2), libc6 (>= 2.2.5)
Let's explore which other packages we have at our disposal besides the default jdk package:
$ apt list openjdk-11*
Listing... Done openjdk-11-dbg/bionic-updates,bionic-security 10.0.2+13-1ubuntu0.18.04.2 amd64 openjdk-11-demo/bionic-updates,bionic-security 10.0.2+13-1ubuntu0.18.04.2 amd64 openjdk-11-doc/bionic-updates,bionic-updates,bionic-security,bionic-security 10.0.2+13-1ubuntu0.18.04.2 all openjdk-11-jdk/bionic-updates,bionic-security 10.0.2+13-1ubuntu0.18.04.2 amd64 openjdk-11-jdk-headless/bionic-updates,bionic-security 10.0.2+13-1ubuntu0.18.04.2 amd64 openjdk-11-jre/bionic-updates,bionic-security,now 10.0.2+13-1ubuntu0.18.04.2 amd64 [installed,automatic] openjdk-11-jre-headless/bionic-updates,bionic-security,now 10.0.2+13-1ubuntu0.18.04.2 amd64 [installed,automatic] openjdk-11-jre-zero/bionic-updates,bionic-security 10.0.2+13-1ubuntu0.18.04.2 amd64 openjdk-11-source/bionic-updates,bionic-updates,bionic-security,bionic-security 10.0.2+13-1ubuntu0.18.04.2 all
We may find some of these packages useful. For example, openjdk-11-source contains source files for the classes of the Java core API, while openjdk-11-dbg contains the debugging symbols.
Besides the openjdk-* family, there's the default-jdk package, that is worth exploring:
$ apt show default-jdk
At the end of the output, the description says:
“This dependency package points to the Java runtime, or Java compatible development kit recommended for this architecture…”
In the case of Ubuntu 18.04 LTS, it's the package openjdk-11-jdk at the moment.
8. Overview: Java Versions and Packages
Now, let's have a look at how different versions of Java could be installed on Ubuntu 18.04 LTS as of this writing:
Version | OpenJDK | Oracle Java |
11 | manual installation | manual installation oracle-java11-installer in the linuxuprising PPA |
10 | manual installation – not supported | manual installation – not supported |
9 | manual installation – not supported | manual installation – not supported |
8 | openjdk-8-jdk in the “Main” repository | oracle-java8-installer in the webupd8team PPA |
9. Multiple Java Versions on an Ubuntu System
The standard way for managing multiple versions of the same software on Ubuntu is via the Debian Alternatives System. Most of the time we create, maintain and display alternatives via the update-alternatives program.
When apt installs a JDK package, it automatically adds the entries for the alternatives. In the case of manual installation, we've seen how to add the alternatives for java and javac respectively.
Let's have a look at our alternatives:
$ update-alternatives --display java
On our test system, where we've installed two different versions of OpenJDK, the output lists both alternatives with their respective priorities:
java - auto mode link best version is /usr/lib/jvm/java-11-openjdk-amd64/bin/java link currently points to /usr/lib/jvm/java-11-openjdk-amd64/bin/java link java is /usr/bin/java slave java.1.gz is /usr/share/man/man1/java.1.gz /usr/lib/jvm/java-11-openjdk-amd64/bin/java - priority 1101 slave java.1.gz: /usr/lib/jvm/java-11-openjdk-amd64/man/man1/java.1.gz /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java - priority 1081 slave java.1.gz: /usr/lib/jvm/java-8-openjdk-amd64/jre/man/man1/java.1.gz
Now that we've seen our alternatives, we can also switch between them:
$ sudo update-alternatives --config java
Además, obtenemos una salida interactiva, donde podemos cambiar entre las alternativas a través del teclado:
There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 auto mode 1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode Press to keep the current choice[*], or type selection number:
Si estamos trabajando en varias aplicaciones escritas en diferentes versiones de Java, es probable que también necesitemos diferentes versiones de otro software (por ejemplo, Maven, algún servidor de aplicaciones). En ese caso, es posible que queramos considerar el uso de mayores abstracciones, como los contenedores Docker.
10. Conclusión
Para resumir, en este artículo, hemos visto ejemplos de instalación de un JDK desde el repositorio "Principal", desde un PPA y manualmente. Hemos comparado brevemente estos tres métodos de instalación.
Y finalmente, hemos visto cómo administrar múltiples instalaciones de Java en el sistema Ubuntu con alternativas de actualización .
Como siguiente paso, puede resultar útil establecer la variable de entorno JAVA_HOME .