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
/quietparametresi 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
Windows + Rtuşlarına basın,sysdm.cplyazın ve Enter’a basın- Advanced sekmesine geçin
- Environment Variables butonuna tıklayın
- System variables bölümünde New butonuna tıklayın
- Variable name:
JAVA_HOME, Variable value:C:Program FilesEclipse Adoptiumjdk-17.0.10.7-hotspotgirin - System variables listesinde Path değişkenini bulun, Edit butonuna tıklayın
- New diyerek
%JAVA_HOME%binekleyin - 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_HOMEdeğişkenini sistem seviyesinde (Machinescope) ayarlayın, kullanıcı seviyesinde değil- PATH değişkenine
%JAVA_HOME%binekleyin 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.
