How to Install Java on Linux via apt and yum/dnf

On Linux, Java installs through your package manager: apt for Debian-family distros, dnf (or the older yum) for Red Hat-family. Both pull from trusted repositories and handle upgrades automatically.

apt (Debian, Ubuntu, Linux Mint, Pop!_OS)

# Update package index first
sudo apt update

# Java 21 JDK (Ubuntu 22.04+)
sudo apt install openjdk-21-jdk -y

# Java 17 JDK
sudo apt install openjdk-17-jdk -y

# Verify
java -version
javac -version

Adding the Adoptium repository (for versions not in default apt repos)

wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public \
  | sudo gpg --dearmor -o /usr/share/keyrings/adoptium.gpg

echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] \
  https://packages.adoptium.net/artifactory/deb \
  $(. /etc/os-release && echo "$VERSION_CODENAME") main" \
  | sudo tee /etc/apt/sources.list.d/adoptium.list

sudo apt update
sudo apt install temurin-21-jdk -y

dnf (Fedora, RHEL 8+, CentOS Stream, AlmaLinux, Rocky Linux)

# Java 21
sudo dnf install java-21-openjdk-devel -y

# Java 17
sudo dnf install java-17-openjdk-devel -y

# Verify
java -version

yum (RHEL 7, older CentOS)

sudo yum install java-11-openjdk-devel -y
# Java 17/21 may require EPEL or a separate repo:
sudo yum install epel-release -y
sudo yum install java-21-openjdk-devel -y

Managing multiple JDKs with update-alternatives

# See all registered java alternatives:
sudo update-alternatives --display java

# Interactive switch:
sudo update-alternatives --config java

On Fedora/RHEL, use alternatives (same tool, different name):

sudo alternatives --config java

Setting JAVA_HOME system-wide

Create a file in /etc/profile.d/:

echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))' \
  | sudo tee /etc/profile.d/java.sh
source /etc/profile.d/java.sh
echo $JAVA_HOME

Install without root (SDKMAN!)

curl -s "https://get.sdkman.io" | bash
source ~/.sdkman/bin/sdkman-init.sh
sdk install java 21.0.3-tem

SDKMAN! installs entirely in ~/.sdkman — no sudo needed, and you can switch versions per shell session or per directory.