Skip to main content

Java Installation Guide

Java is a widely-used programming language and development platform. This guide covers installing the Java Development Kit (JDK) on Windows 11, macOS, and Linux.

Trademark Notice

Java® and OpenJDK™ are trademarks or registered trademarks of Oracle and/or its affiliates. All trademarks and logos are used for representation purposes only. No prior copyright or trademark authorization has been obtained. This documentation is for educational purposes only.

JDK Distributions

DistributionTypeBest ForSupport
Oracle JDKCommercialEnterprise, Oracle productsPaid support
OpenJDKOpen SourceGeneral use, freeCommunity
Amazon CorrettoOpen SourceAWS workloadsFree, AWS backed
Azul ZuluCommercialProduction, free buildsPaid support available
Eclipse TemurinOpen SourceGeneral use, AdoptOpenJDK successorCommunity
GraalVMOpen SourceHigh performance, polyglotCommunity/Enterprise

Choosing a Java Version

  • Java 21 (LTS): Latest long-term support (September 2023)
  • Java 17 (LTS): Current standard for most projects (September 2021)
  • Java 11 (LTS): Older LTS, still widely used (September 2018)
  • Java 8 (LTS): Legacy support (March 2014)

Recommendation: Use Java 17 or 21 for new projects.


Windows 11 Installation

Method 1: Oracle JDK (Official)

# Download from Oracle website
# Visit: https://www.oracle.com/java/technologies/downloads/
# Choose Windows x64 Installer

# Or using winget
winget search Oracle.JDK
winget install Oracle.JDK.21

# Verify installation
java -version
javac -version

Method 2: OpenJDK (Microsoft Build)

# Using winget (Recommended)
winget install Microsoft.OpenJDK.17

# Or download from
# https://learn.microsoft.com/en-us/java/openjdk/download

# Verify
java -version

Method 3: Eclipse Temurin (Adoptium)

# Using winget
winget install EclipseAdoptium.Temurin.17.JDK
winget install EclipseAdoptium.Temurin.21.JDK

# Or using Chocolatey
choco install temurin17
choco install temurin21

# Or download MSI installer
# Visit: https://adoptium.net/

# Verify
java -version
javac -version

Method 4: Amazon Corretto

# Download from https://aws.amazon.com/corretto/
# Or using Chocolatey
choco install corretto17jdk
choco install corretto21jdk

# Verify
java -version

Set JAVA_HOME (Windows)

# Method 1: PowerShell (temporary)
$env:JAVA_HOME = "C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot"
$env:PATH = "$env:JAVA_HOME\bin;$env:PATH"

# Method 2: System Environment Variables (permanent)
# 1. Open System Properties → Advanced → Environment Variables
# 2. Create new System Variable:
# Variable name: JAVA_HOME
# Variable value: C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot
# 3. Edit PATH variable, add: %JAVA_HOME%\bin

# Method 3: Using setx (permanent)
setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot" /M
setx PATH "%PATH%;%JAVA_HOME%\bin" /M

# Verify
echo $env:JAVA_HOME
java -version

macOS Installation

# Install Homebrew if not already installed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install OpenJDK
brew install openjdk@17
brew install openjdk@21

# Create symlink
sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

# For Intel Macs, path might be different:
# sudo ln -sfn /usr/local/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

# Verify
java -version
javac -version

Method 2: Eclipse Temurin (Adoptium)

# Using Homebrew
brew install --cask temurin17
brew install --cask temurin21

# Or download .pkg installer
# Visit: https://adoptium.net/

# Verify
java -version

Method 3: SDKMAN! (Best for Multiple Versions)

# Install SDKMAN!
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# List available Java versions
sdk list java

# Install specific version
sdk install java 17.0.9-tem # Temurin 17
sdk install java 21.0.1-tem # Temurin 21
sdk install java 17.0.9-amzn # Amazon Corretto 17
sdk install java 21.0.1-graalce # GraalVM CE 21

# Use specific version
sdk use java 17.0.9-tem

# Set default version
sdk default java 17.0.9-tem

# List installed versions
sdk list java | grep installed

# Verify
java -version

Method 4: Oracle JDK

# Download from Oracle website
# Visit: https://www.oracle.com/java/technologies/downloads/
# Choose macOS ARM64 or x64 DMG

# Install .dmg package
# Follow installer prompts

# Verify
java -version

Method 5: Azul Zulu

# Using Homebrew
brew tap mdogan/zulu
brew install --cask zulu-jdk17
brew install --cask zulu-jdk21

# Or download from https://www.azul.com/downloads/

# Verify
java -version

Set JAVA_HOME (macOS)

# Check installed JDKs
/usr/libexec/java_home -V

# Set JAVA_HOME in shell profile (~/.zshrc or ~/.bash_profile)
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH=$JAVA_HOME/bin:$PATH

# For specific version
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
# or
export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home

# Reload shell
source ~/.zshrc

# Verify
echo $JAVA_HOME
java -version

Linux Installation

Method 1: Package Manager (Ubuntu/Debian)

# Update package index
sudo apt update

# Install OpenJDK 17 (Recommended)
sudo apt install -y openjdk-17-jdk

# Or OpenJDK 21
sudo apt install -y openjdk-21-jdk

# Or OpenJDK 11
sudo apt install -y openjdk-11-jdk

# Verify
java -version
javac -version

Method 2: Package Manager (RHEL/CentOS/Fedora)

# Install OpenJDK 17
sudo dnf install -y java-17-openjdk-devel

# Or OpenJDK 21
sudo dnf install -y java-21-openjdk-devel

# Or OpenJDK 11
sudo dnf install -y java-11-openjdk-devel

# Verify
java -version
javac -version

Method 3: Package Manager (Arch Linux)

# Install OpenJDK
sudo pacman -S jdk-openjdk

# Or specific version
sudo pacman -S jdk17-openjdk
sudo pacman -S jdk11-openjdk

# Verify
java -version

Method 4: SDKMAN! (Best for Development)

# Install SDKMAN!
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# List available Java versions
sdk list java

# Install versions
sdk install java 17.0.9-tem # Eclipse Temurin 17
sdk install java 21.0.1-tem # Eclipse Temurin 21
sdk install java 17.0.9-amzn # Amazon Corretto 17
sdk install java 17.0.9-zulu # Azul Zulu 17
sdk install java 21.0.1-graalce # GraalVM CE 21

# Use specific version
sdk use java 17.0.9-tem

# Set default
sdk default java 17.0.9-tem

# Switch between versions
sdk use java 21.0.1-tem
sdk use java 17.0.9-tem

# Verify
java -version

Method 5: Eclipse Temurin (Adoptium)

# Ubuntu/Debian
wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo apt-key add -
echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list

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

# Verify
java -version

Method 6: Amazon Corretto

# Download and install (Debian/Ubuntu)
wget -O- https://apt.corretto.aws/corretto.key | sudo apt-key add -
sudo add-apt-repository 'deb https://apt.corretto.aws stable main'

sudo apt-get update
sudo apt-get install -y java-17-amazon-corretto-jdk
sudo apt-get install -y java-21-amazon-corretto-jdk

# For RHEL/CentOS/Fedora
sudo rpm --import https://yum.corretto.aws/corretto.key
sudo curl -Lo /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo

sudo dnf install -y java-17-amazon-corretto-devel
sudo dnf install -y java-21-amazon-corretto-devel

# Verify
java -version

Method 7: Manual Installation (Any Linux)

# Download JDK archive from OpenJDK or Adoptium
wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz

# Extract
tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz

# Move to /opt
sudo mv jdk-17.0.9+9 /opt/jdk-17

# Verify
/opt/jdk-17/bin/java -version

Set JAVA_HOME (Linux)

# Find Java installation path
which java
readlink -f $(which java)
# or
update-alternatives --list java

# Set JAVA_HOME in ~/.bashrc or ~/.zshrc
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# For manual installation
export JAVA_HOME=/opt/jdk-17
export PATH=$JAVA_HOME/bin:$PATH

# Reload shell
source ~/.bashrc

# Verify
echo $JAVA_HOME
java -version
javac -version

Managing Multiple Java Versions

Linux (update-alternatives)

# List all Java versions
update-alternatives --list java

# Configure default Java version
sudo update-alternatives --config java

# Configure default javac version
sudo update-alternatives --config javac

# Install alternative
sudo update-alternatives --install /usr/bin/java java /opt/jdk-17/bin/java 1
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-17/bin/javac 1

# Set specific version
sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java

macOS (jenv)

# Install jenv
brew install jenv

# Add to shell profile (~/.zshrc)
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"

# Reload
source ~/.zshrc

# Add Java versions to jenv
jenv add /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home

# List versions
jenv versions

# Set global version
jenv global 17

# Set local version (for current directory)
jenv local 21

# Set shell version (for current shell session)
jenv shell 17

# Verify
java -version

SDKMAN (All Platforms)

# List installed versions
sdk list java | grep installed

# Switch version for current shell
sdk use java 17.0.9-tem

# Set default version
sdk default java 17.0.9-tem

# Install new version
sdk install java 21.0.1-tem

# Uninstall version
sdk uninstall java 11.0.20-tem

Verification & Testing

Basic Commands

# Check Java version
java -version
java --version

# Check Java compiler
javac -version

# Check JAVA_HOME
echo $JAVA_HOME # Unix/macOS
echo $env:JAVA_HOME # PowerShell

# Check PATH
which java # Unix/macOS
where.exe java # Windows

# Java properties
java -XshowSettings:properties -version

Test Java Installation

Create HelloWorld.java:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("Java home: " + System.getProperty("java.home"));
}
}

Compile and run:

# Compile
javac HelloWorld.java

# Run
java HelloWorld

# Clean up
rm HelloWorld.class

Test with Maven

# Install Maven
# Windows: choco install maven
# macOS: brew install maven
# Linux: sudo apt install maven

# Create test project
mvn archetype:generate -DgroupId=com.example -DartifactId=test-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

cd test-app

# Build
mvn clean package

# Run
java -cp target/test-app-1.0-SNAPSHOT.jar com.example.App

Development Tools

Maven Installation

# Windows
choco install maven
winget install Apache.Maven

# macOS
brew install maven

# Linux (Ubuntu/Debian)
sudo apt install -y maven

# Linux (RHEL/Fedora)
sudo dnf install -y maven

# Verify
mvn -version

Gradle Installation

# Windows
choco install gradle
winget install Gradle.Gradle

# macOS
brew install gradle

# Linux
sdk install gradle

# Or manual
wget https://services.gradle.org/distributions/gradle-8.5-bin.zip
unzip gradle-8.5-bin.zip
sudo mv gradle-8.5 /opt/gradle
export PATH=/opt/gradle/bin:$PATH

# Verify
gradle -version

IDE Recommendations

  • IntelliJ IDEA: Most popular Java IDE
  • Eclipse: Free, open-source IDE
  • Visual Studio Code: Lightweight with Java extensions
  • NetBeans: Apache-backed IDE

Common Issues & Solutions

Issue: JAVA_HOME Not Set

# Check if JAVA_HOME is set
echo $JAVA_HOME

# If empty, set it (example for Linux)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# Make permanent by adding to ~/.bashrc or ~/.zshrc

Issue: Multiple Java Versions Conflict

# Use update-alternatives (Linux)
sudo update-alternatives --config java

# Use jenv (macOS)
jenv global 17

# Use SDKMAN (All platforms)
sdk use java 17.0.9-tem

Issue: javac: command not found

# Install JDK, not just JRE
sudo apt install openjdk-17-jdk # Linux
brew install openjdk@17 # macOS

# Check PATH includes JDK bin directory
echo $PATH | grep java

Issue: Permission Denied

# Fix permissions (Linux/macOS)
sudo chmod +x /path/to/java/bin/*

# Or reinstall with proper permissions

Issue: Certificate Errors

# Update ca-certificates
sudo apt update
sudo apt install --reinstall ca-certificates-java

# Or manually update keystore
sudo keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -alias mycert -file cert.pem

Best Practices

Use LTS versions (11, 17, or 21) for production
Set JAVA_HOME properly in system environment
Use version manager (SDKMAN/jenv) for development
Keep JDK updated for security patches
Use same Java version across team
Document Java version in project README
Use .java-version file for projects

.java-version File

# Create .java-version in project root
echo "17.0.9-tem" > .java-version

# SDKMAN will auto-switch when entering directory
# (requires: sdk env install)

Next Steps

Java Installed Successfully!

Continue learning:

Additional Resources