Utilizar diferentes Java JDK (o JREs) en Ubuntu

Problema

El problema es típico y sencillo de arreglar: Trabajar en Ubuntu y desarrollas en Java pero tienes proyectos que utilizan diferentes JDKs (o JREs). ¿Cómo arreglarlo de forma fácil? Primero vamos a suponer que tienes 3 versiones de la JDK, yo los he instalado con estos comandos:

sudo apt install -y openjdk-8-jdk-headless
sudo apt install -y openjdk-17-jdk-headless
sudo apt install -y openjdk-21-jdk-headless

Por defecto y de forma automática tendremos disponible la última versión.

$ java -version
openjdk version "21.0.10" 2026-01-20

$ javac -version
javac 21.0.10

¿Cómo cambiar la versión predeterminada?

Para cambiar la versión “seleccionada” por el sistema podemos usar el comando update-alternatives. Con el siguiente comando podemos ver todos los comandos referentes a java:

sudo update-alternatives --get-selections | grep java

Ejecuta los siguientes comandos y seleccionamos el número de la versión deseada (tanto para java y javac):

$ sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-21-openjdk-amd64/bin/java      2111      auto mode
  1            /usr/lib/jvm/java-17-openjdk-amd64/bin/java      1711      manual mode
  2            /usr/lib/jvm/java-21-openjdk-amd64/bin/java      2111      manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

Press  to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-17-openjdk-amd64/bin/java to provide /usr/bin/java (java) in manual mode

$ java -version
openjdk version "17.0.18" 2026-01-20
OpenJDK Runtime Environment (build 17.0.18+8-Ubuntu-124.04.1)
OpenJDK 64-Bit Server VM (build 17.0.18+8-Ubuntu-124.04.1, mixed mode, sharing)

$ sudo update-alternatives --config javac
There are 3 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                          Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-21-openjdk-amd64/bin/javac   2111      auto mode
  1            /usr/lib/jvm/java-17-openjdk-amd64/bin/javac   1711      manual mode
  2            /usr/lib/jvm/java-21-openjdk-amd64/bin/javac   2111      manual mode
  3            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac    1081      manual mode

Press  to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-17-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in manual mode

$ javac -version
javac 17.0.18

Y ya está, hay más formas como usar jEnv o SDKMAN, pero eso lo dejo para otra entrada.

¡Espero que sea de ayuda!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

This site uses Akismet to reduce spam. Learn how your comment data is processed.