Cómo configurar JAVA_HOME en CentOS / RHEL / Fedora / AlmaLinux / Rocky Linux

JAVA_HOME es variable de entorno que apunta al directorio de instalación del JDK/JRE. Necesaria para Maven, Gradle, Tomcat, Jenkins, Kafka, Spark, Hadoop, Elasticsearch, y apps Java.

1. Localizar tu instalación Java

# Paquetes RPM (dnf/yum)
rpm -ql java-1.8.0-openjdk-devel | head -20
rpm -ql java-11-openjdk-devel | head -20
rpm -ql java-17-openjdk-devel | head -20
rpm -ql java-21-openjdk-devel | head -20

# Alternativa: alternatives
alternatives --config java
# Muestra rutas como /usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el9.x86_64/bin/java
# JAVA_HOME = directorio PADRE de bin/ (sin /bin/java)

2. Establecer JAVA_HOME system-wide (todos los usuarios, persistente)

Opción A: /etc/profile.d/java.sh (recomendado, modular, sobrevive actualizaciones)

sudo tee /etc/profile.d/java.sh <<'EOF'
#!/bin/bash
# JAVA_HOME para OpenJDK 17 (ajusta versión instalada)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
EOF
sudo chmod +x /etc/profile.d/java.sh

Reinicia sesión o `source /etc/profile.d/java.sh`. Verifica: `echo $JAVA_HOME` → `/usr/lib/jvm/java-17-openjdk`.

Opción B: /etc/environment (simple, sin scripts)

sudo tee -a /etc/environment <<'EOF'
JAVA_HOME="/usr/lib/jvm/java-17-openjdk"
EOF

Requiere reinicio completo del sistema (no basta recargar shell).

Opción C: /etc/profile (tradicional, menos limpio)

echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' | sudo tee -a /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile

3. Establecer JAVA_HOME para usuario actual (~/.bashrc / ~/.bash_profile)


echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

Solo afecta a tu usuario, shells interactivos login/no-login según distro.

4. Gestionar múltiples versiones (alternatives / sdkman)

alternatives (nivel sistema)


alternatives --config java       # elige java por defecto
alternatives --config javac      # elige compilador
# JAVA_HOME dinámico en script:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))

SDKMAN! (por usuario, múltiples JDKs, fácil cambio)


curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk list java
sdk install java 21.0.2-tem
sdk use java 21.0.2-tem
# SDKMAN auto-configura JAVA_HOME y PATH en ~/.bashrc/.zshrc

5. Verificar


echo $JAVA_HOME
java -version
javac -version
mvn -version   # si usas Maven
gradle -v      # si usas Gradle

6. Docker / Contenedores

En Dockerfile: `ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk` (imagen base ya lo trae). No dupliques en entrypoint.

7. Solución de problemas

  • JAVA_HOME apunta a JRE no JDK: Maven/Gradle necesitan `tools.jar` (JDK). Asegura `-devel` / `-jdk` package.
  • Ruta con symlink: `readlink -f` resuelve. `/usr/lib/jvm/java-17` suele ser symlink a versión concreta.
  • Permisos: directorio legible/ejecutable por usuario que ejecuta la app.
  • Systemd services: añade `Environment=JAVA_HOME=...` en unidad `.service` o `EnvironmentFile=/etc/profile.d/java.sh`.