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.
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
| Distribution | Type | Best For | Support |
|---|---|---|---|
| Oracle JDK | Commercial | Enterprise, Oracle products | Paid support |
| OpenJDK | Open Source | General use, free | Community |
| Amazon Corretto | Open Source | AWS workloads | Free, AWS backed |
| Azul Zulu | Commercial | Production, free builds | Paid support available |
| Eclipse Temurin | Open Source | General use, AdoptOpenJDK successor | Community |
| GraalVM | Open Source | High performance, polyglot | Community/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
Method 1: Homebrew (Recommended)
# 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: