Windows Server’a JDK Kurulumu ve JAVA_HOME Ayarı

Java tabanlı uygulamaları Windows Server üzerinde çalıştırmak, kurumsal ortamlarda son derece yaygın bir senaryo. Tomcat, JBoss, Jenkins, Elasticsearch gibi kritik sistemlerin hepsi JVM üzerinde koşuyor ve bu sistemlerin sağlıklı çalışması büyük ölçüde doğru bir JDK kurulumuna bağlı. Yanlış yapılandırılmış bir JAVA_HOME değişkeni ya da path sorunu, saatlerce süren hata ayıklama seanslarına zemin hazırlayabiliyor. Bu yazıda Windows Server ortamında JDK kurulumunu, ortam değişkenlerinin doğru ayarlanmasını ve sık karşılaşılan sorunların çözümünü adım adım ele alacağız.

JDK mi JRE mi? Önce Bunu Netleştirelim

Sysadmin olarak bu soruyu defalarca aldım. JRE (Java Runtime Environment), sadece Java uygulamalarını çalıştırmak için gerekli minimum bileşenleri içerir. JDK (Java Development Kit) ise JRE’nin üzerine derleyici (javac), arşivleyici (jar), debugger ve geliştirme araçlarını ekler.

Sunucu ortamlarında çoğu zaman JDK kurmanız gerekiyor çünkü:

  • Jenkins, Maven veya Gradle gibi CI/CD araçları derleme yapabilmek için JDK ister
  • Tomcat yönetim scriptleri JDK araçlarına başvurabilir
  • Bazı uygulama sunucuları runtime sırasında bytecode manipülasyonu yapar ve JDK bileşenlerine ihtiyaç duyar
  • Diagnostik araçlar (jstack, jmap, jconsole) sadece JDK içinde gelir

Kısaca: üretime Java uygulaması deploy edecekseniz bile JDK kurun, sonradan pişman olmazsınız.

Hangi JDK Dağıtımını Seçmeli?

Oracle JDK, lisanslama politikalarını 2019’dan itibaren değiştirdi ve ticari kullanım için ücretli hale geldi. Bu nedenle Windows Server ortamlarında artık açık kaynak alternatifleri çok daha yaygın:

  • Eclipse Temurin (eski adıyla AdoptOpenJDK): En yaygın kullanılan ücretsiz dağıtım, Adoptium projesi tarafından yönetiliyor
  • Microsoft Build of OpenJDK: Azure ortamlarında Microsoft’un kendi derlediği versiyon, Windows entegrasyonu açısından iyi
  • Amazon Corretto: AWS’nin desteklediği dağıtım, hem Linux hem Windows için mevcut
  • Azul Zulu: Kurumsal destek seçenekleri olan popüler bir alternatif
  • Oracle JDK: Lisans anlaşmanız varsa veya Oracle destek paketi kullanıyorsanız tercih edilebilir

Hangi versiyon? Java LTS (Long Term Support) versiyonları üretim için tercih edilmeli. Şu an aktif LTS versiyonlar Java 11, Java 17 ve Java 21. Java 17 özellikle kurumsal ortamlarda altın standart haline geldi. Uygulamanızın gerektirdiği versiyonu seçin, ama mümkünse LTS üzerinde kalın.

JDK İndir ve Kur

Bu yazıda Eclipse Temurin JDK 17 üzerinden gideceğiz. İndirme için https://adoptium.net adresine gidin ya da doğrudan PowerShell ile indirebilirsiniz:

# PowerShell ile Temurin JDK 17 indir
Invoke-WebRequest -Uri "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_windows_hotspot_17.0.10_7.msi" -OutFile "C:TempOpenJDK17.msi"

MSI paketi ile kurulum önerilen yöntem çünkü:

  • Uninstall / güncelleme yönetimi Windows Add/Remove Programs üzerinden yapılabiliyor
  • Otomatik kurulum scriptleri için /quiet parametresi destekleniyor
  • Registry kayıtları düzgün oluşturuluyor

Sessiz kurulum için:

# MSI sessiz kurulum - yönetici PowerShell ile çalıştırın
msiexec /i "C:TempOpenJDK17.msi" /quiet /norestart ADDLOCAL=FeatureMain,FeatureEnvironment,FeatureJarFileRunWith,FeatureJavaHome

Buradaki parametreler önemli:

  • ADDLOCAL=FeatureMain: Temel JDK bileşenlerini kurar
  • FeatureEnvironment: PATH değişkenine otomatik ekler
  • FeatureJarFileRunWith: .jar dosyalarını çift tıklamayla açma özelliği
  • FeatureJavaHome: JAVA_HOME değişkenini otomatik ayarlar

MSI kurulumu tamamlandıktan sonra bile JAVA_HOME değişkenini elle doğrulamanızı ve gerekirse düzeltmenizi öneriyorum. Otomatik ayarlanan değerler bazen beklenmedik sonuçlar verebiliyor.

JAVA_HOME Değişkenini Manuel Olarak Ayarlamak

Kurulum MSI ile otomatik yapılmış olsa bile, kurumsal ortamlarda JAVA_HOME‘u el ile yönetmek çok daha güvenli. Özellikle birden fazla JDK versiyonu olan sunucularda bu bir zorunluluk.

Sistem Ortam Değişkenlerini GUI ile Ayarlama

  1. Windows + R tuşlarına basın, sysdm.cpl yazın ve Enter’a basın
  2. Advanced sekmesine geçin
  3. Environment Variables butonuna tıklayın
  4. System variables bölümünde New butonuna tıklayın
  5. Variable name: JAVA_HOME, Variable value: C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspot girin
  6. System variables listesinde Path değişkenini bulun, Edit butonuna tıklayın
  7. New diyerek %JAVA_HOME%bin ekleyin
  8. Tüm pencereleri OK ile kapatın

PowerShell ile Ortam Değişkenlerini Ayarlama

Otomasyon senaryoları ve scriptler için PowerShell kullanmak çok daha pratik:

# JAVA_HOME'u sistem genelinde ayarla (kalıcı, makine seviyesinde)
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspot", [System.EnvironmentVariableTarget]::Machine)

# PATH değişkenine JAVA_HOMEbin ekle
$currentPath = [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine)
if ($currentPath -notlike "*JAVA_HOME*") {
    $newPath = $currentPath + ";%JAVA_HOME%bin"
    [System.Environment]::SetEnvironmentVariable("Path", $newPath, [System.EnvironmentVariableTarget]::Machine)
    Write-Host "PATH güncellendi." -ForegroundColor Green
} else {
    Write-Host "JAVA_HOME zaten PATH içinde mevcut." -ForegroundColor Yellow
}

Değişikliklerin mevcut oturuma yansıması için ya yeni bir terminal açın ya da aşağıdaki komutu kullanın:

# Mevcut PowerShell oturumunu güncelle
$env:JAVA_HOME = "C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspot"
$env:Path = $env:Path + ";$env:JAVA_HOMEbin"

# Doğrulama
java -version
javac -version

Kurulumu Doğrulama

# Java versiyonunu kontrol et
java -version

# Beklenen çıktı:
# openjdk version "17.0.10" 2024-01-16
# OpenJDK Runtime Environment Temurin-17.0.10+7 (build 17.0.10+7)
# OpenJDK 64-Bit Server VM Temurin-17.0.10+7 (build 17.0.10+7, mixed mode, sharing)

# Derleyiciyi kontrol et
javac -version
# javac 17.0.10

# JAVA_HOME değişkenini kontrol et
echo %JAVA_HOME%
# ya da PowerShell'de:
$env:JAVA_HOME

Birden Fazla JDK Versiyonu Yönetimi

Gerçek kurumsal senaryolarda birden fazla Java versiyonu aynı sunucuda bulunmak zorunda kalabiliyor. Eski bir uygulama Java 8 isterken, yeni microservice’iniz Java 17 ile gelmiş olabilir. Bu durumun yönetimi biraz dikkat gerektirir.

Önce her iki JDK’yı farklı dizinlere kurun:

  • Java 8: C:Javajdk8
  • Java 11: C:Javajdk11
  • Java 17: C:Javajdk17

Aktif versiyonu değiştirmek için bir PowerShell scripti:

# switch-java.ps1 - Aktif Java versiyonunu değiştir
param(
    [Parameter(Mandatory=$true)]
    [ValidateSet("8", "11", "17")]
    [string]$Version
)

$javaPaths = @{
    "8"  = "C:Javajdk8"
    "11" = "C:Javajdk11"
    "17" = "C:Javajdk17"
}

$selectedPath = $javaPaths[$Version]

if (-not (Test-Path $selectedPath)) {
    Write-Error "JDK $Version bulunamadı: $selectedPath"
    exit 1
}

# JAVA_HOME'u güncelle
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", $selectedPath, [System.EnvironmentVariableTarget]::Machine)

# PATH'ten eski Java girişlerini temizle ve yenisini ekle
$path = [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine)
$cleanPath = ($path -split ";" | Where-Object { $_ -notmatch "C:\Java\jdk" }) -join ";"
$newPath = "$selectedPathbin;$cleanPath"
[System.Environment]::SetEnvironmentVariable("Path", $newPath, [System.EnvironmentVariableTarget]::Machine)

Write-Host "Aktif Java versiyonu JDK $Version olarak ayarlandı." -ForegroundColor Green
Write-Host "JAVA_HOME: $selectedPath" -ForegroundColor Cyan
Write-Host "Değişikliklerin geçerli olması için yeni bir terminal açın." -ForegroundColor Yellow

Scripti kullanmak için:

# Yönetici PowerShell'de çalıştır
.switch-java.ps1 -Version 17

Windows Servis Olarak Çalışan Java Uygulamaları

Tomcat gibi Java uygulamalarını Windows servis olarak çalıştırıyorsanız, servis ortam değişkenlerini ayrıca yapılandırmanız gerekebilir. Windows servisleri sistem ortam değişkenlerini devralır ama servis kurulumundan sonra yapılan değişiklikler servis yeniden başlatılmadan etkili olmayabilir.

Tomcat için JAVA_HOME doğrulaması:

# Tomcat servis durumunu kontrol et
sc query "Tomcat9"

# Servis ile ilişkili ortam değişkenlerini görüntüle
# Tomcat için catalina.bat dosyasında JAVA_HOME tanımı
type "C:ApacheTomcatbincatalina.bat" | findstr JAVA_HOME

Tomcat service.bat ile servis olarak kurulduğunda JAVA_HOME özellikle belirtilmesi gereken bir parametre:

# Tomcat'i servis olarak kurma
cd C:ApacheTomcatbin
set JAVA_HOME=C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspot
service.bat install TomcatApp

# Servis başlatma
net start TomcatApp

Güvenlik Duvarı ve JMX Ayarları

Üretim ortamlarında JVM monitoring için JMX (Java Management Extensions) sıkça kullanılır. JMX aktifleştirmek için JVM başlangıç parametrelerine ekleme yapılır:

# JMX ile Java uygulaması başlatma (örnek)
java -Dcom.sun.management.jmxremote `
     -Dcom.sun.management.jmxremote.port=9090 `
     -Dcom.sun.management.jmxremote.ssl=false `
     -Dcom.sun.management.jmxremote.authenticate=false `
     -jar myapp.jar

Windows Firewall’da JMX portunu açmak için:

# JMX portu için güvenlik duvarı kuralı ekle
netsh advfirewall firewall add rule name="JMX Remote 9090" dir=in action=allow protocol=TCP localport=9090

Sık Karşılaşılan Sorunlar ve Çözümleri

java komutu tanınmıyor hatası:

Bu sorun genellikle PATH değişkenine %JAVA_HOME%bin eklenmediğinde ya da değişikliklerin mevcut oturuma yansımadığında olur. Yeni bir Command Prompt veya PowerShell penceresi açıp tekrar deneyin.

# Hangi java çalıştığını kontrol et
where java
# PATH'in doğru sıralandığını kontrol et
echo %PATH%

Yanlış Java versiyonu çalışıyor:

Birden fazla Java kurulumu varsa sistem önce PATH’te önce gelen versiyonu kullanır. where java komutu hangi java.exe‘nin kullanıldığını gösterir.

# Tüm java.exe konumlarını listele
where java
# Beklenen çıktı sadece bir satır göstermeli
# C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspotbinjava.exe

JAVA_HOME boşluklu dizin sorunu:

Program Files gibi boşluk içeren dizinler bazı eski scriptlerde sorun çıkarabilir. Bu durumda kısa yol adını kullanabilirsiniz:

# Kısa yol adını öğren
for %I in ("C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspot") do echo %~sI
# Çıktı: C:PROGRA~1ECLIPS~1JDK-17~1.7-H

Ya da daha temiz çözüm: JDK’yı boşluksuz bir dizine kurun, örneğin C:Javajdk17.

Servis başlamıyor, Event Log’da JAVA_HOME hatası:

Windows Event Viewer’da Application log’una bakın. Java servisi JAVA_HOME bulamazsa açıklayıcı bir hata mesajı bırakır.

# Event Log'dan son Java hatalarını filtrele
Get-EventLog -LogName Application -Source "*java*" -Newest 20 | Format-List TimeGenerated, Message

Grup İlkesi ile Kurumsal Dağıtım

Büyük ölçekli ortamlarda onlarca sunucuya JDK kurmak ve JAVA_HOME ayarlamak için Group Policy Object (GPO) veya SCCM/Intune kullanmak gerekir. Temel PowerShell deployment scripti:

# deploy-jdk.ps1 - Uzak sunuculara JDK dağıt
param(
    [string[]]$Servers,
    [string]$InstallerPath = "\fileserversoftwareOpenJDK17.msi",
    [string]$JavaHome = "C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspot"
)

foreach ($server in $Servers) {
    Write-Host "[$server] JDK kurulumu başlatılıyor..." -ForegroundColor Cyan

    $session = New-PSSession -ComputerName $server -ErrorAction Stop

    Invoke-Command -Session $session -ScriptBlock {
        param($installer, $javaHome)

        # MSI kurulumu
        $result = Start-Process msiexec -ArgumentList "/i `"$installer`" /quiet /norestart" -Wait -PassThru
        if ($result.ExitCode -ne 0) {
            Write-Error "Kurulum başarısız. Exit code: $($result.ExitCode)"
            return
        }

        # JAVA_HOME ayarla
        [System.Environment]::SetEnvironmentVariable("JAVA_HOME", $javaHome, [System.EnvironmentVariableTarget]::Machine)
        Write-Host "JDK kurulumu tamamlandı." -ForegroundColor Green

    } -ArgumentList $InstallerPath, $JavaHome

    Remove-PSSession $session
}

Sonuç

Windows Server üzerinde doğru bir JDK kurulumu ve JAVA_HOME yapılandırması, Java tabanlı tüm altyapının sağlıklı çalışmasının temelini oluşturuyor. MSI ile otomatik kurulum ilk adım için yeterli olsa da özellikle birden fazla Java versiyonunun olduğu ortamlarda manuel yönetim kaçınılmaz.

Özetle dikkat etmeniz gerekenler:

  • Üretim ortamı için her zaman LTS versiyonları tercih edin
  • JAVA_HOME değişkenini sistem seviyesinde (Machine scope) ayarlayın, kullanıcı seviyesinde değil
  • PATH değişkenine %JAVA_HOME%bin ekleyin ve değişiklikleri yeni terminal açarak doğrulayın
  • Birden fazla JDK varsa PATH sıralamasına dikkat edin
  • Deployment otomasyonu için PowerShell scriptleri hazırlayın, her sunucuya tek tek bağlanmaktan kurtulun
  • JDK yolunda boşluk içeren dizinlerden kaçının veya dikkatli yönetin

Bu adımları takip ettiğinizde Tomcat’ten Jenkins’e, Elasticsearch’ten Spring Boot uygulamalarına kadar tüm Java tabanlı sistemleriniz tutarlı ve öngörülebilir bir ortamda çalışacak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir