Gestión de Múltiples JDKs (17 y 21): JAVA_HOME y SDKMAN!
Una máquina de desarrollo a menudo necesita alternar entre Java 17 LTS (para proyectos corporativos vigentes) y Java 21 LTS (para nuevos desarrollos con Virtual Threads). SDKMAN! en Linux/macOS/WSL o gestores de variables de entorno en Windows gestionan el valor de la variable JAVA_HOME y el PATH.
En una línea sdk install java 21.0.2-tem && sdk use java 17.0.10-tem
# Linux / macOS / WSL con SDKMAN!
sdk list java | grep tem # distribuciones Eclipse Temurin disponibles
sdk install java 21.0.4-tem
sdk install java 17.0.12-tem
sdk default java 21.0.4-tem # versión global
# Fijar la versión dentro de un proyecto concreto
echo "java=17.0.12-tem" > .sdkmanrc
sdk env # activa la versión del .sdkmanrc
# Comprobar QUÉ JDK usa Maven (no basta con java -version)
mvn -v
# Apache Maven 3.9.9
# Java version: 17.0.12, vendor: Eclipse Adoptium, runtime: /home/ana/.sdkman/candidates/java/17.0.12-tem
# Windows (PowerShell), solo para la sesión actual
# $env:JAVA_HOME = "C:\Program Files\Eclipse Adoptium\jdk-21.0.4.7-hotspot"
# $env:Path = "$env:JAVA_HOME\bin;$env:Path"
Cómo funciona por dentro
Cuando escribes java o javac en la terminal, el sistema operativo busca el primer ejecutable con ese nombre en el PATH. Maven, en cambio, no mira el PATH: usa la variable JAVA_HOME para localizar el compilador. Por eso es posible que java -version diga 21 y Maven compile con 17. El primer diagnóstico siempre es mvn -v, que imprime la versión de Maven y, debajo, la ruta y versión del JDK que realmente está usando.
Cada versión del JDK genera bytecode con un número de versión de clase (61 para Java 17, 65 para Java 21). Una JVM solo ejecuta clases de su versión o anteriores. Si compilas con 21 y despliegas en un servidor con Java 17, el arranque falla con UnsupportedClassVersionError. La opción <release> del compilador evita el problema: además de fijar la versión del bytecode, restringe las APIs del JDK a las que existían en esa versión.
SDKMAN! (Linux, macOS, WSL) instala varios JDK en paralelo y cambia JAVA_HOME por ti. Con un archivo .sdkmanrc en la raíz del proyecto, sdk env activa automáticamente la versión correcta al entrar en la carpeta. En Windows nativo el equivalente es fijar JAVA_HOME por terminal o usar un gestor como Scoop.
JAVA_HOME no apunta al JDK correcto, Maven compilará con una versión inesperada, provocando errores de versión de bytecode (UnsupportedClassVersionError).
javac para compilar.
Se conecta con Compilación de BytecodeVariables de EntornoEclipse Temurin / Corretto
Compruébalo: java -version muestra 21, pero mvn -v muestra 17. ¿Qué está pasando?
El PATH apunta a un JDK 21, pero JAVA_HOME sigue apuntando a un JDK 17. Maven solo mira JAVA_HOME. Corrige la variable (o usa sdk use) y vuelve a comprobar con mvn -v.