Java & Spring Versiyon Uyumluluğu
Giriş
Spring projelerinde en sık karşılaşılan sorunlardan biri versiyon uyumsuzluğudur. Hangi Java versiyonu hangi Spring Boot versiyonuyla çalışır? Jakarta EE ile javax arasındaki fark nedir? Bu derste tüm bu soruları net şekilde cevaplayacağız.
Java Versiyonları ve Özellikleri
Java 8 (2014) — Bir Devir
Lambda expressions ve Stream API
Optional sınıfı
Interface default methods
Date/Time API (java.time)
Uzun süre en çok kullanılan Java versiyonu oldu
Java 11 (2018) — İlk Modern LTS
Local variable type inference:
var list = new ArrayList<String>();HTTP Client API (java.net.http)
String yeni metotları:
isBlank(),lines(),strip()Java EE ve CORBA modülleri kaldırıldı
Java 17 (2021) — Günümüzün Standardı
Sealed classes ve interfaces
Pattern matching for instanceof
Records (data class):
record Point(int x, int y) {}Text blocks:
""" çok satırlı string """Spring Boot 3.x için minimum gereksinim
Java 21 (2023) — Gelecek
Virtual threads (Project Loom): Hafif, yüksek ölçekli iş parçacıkları
Pattern matching for switch
Record patterns
Sequenced collections
// Java 17 Records + Spring Boot 3.x
public record UserDto(
Long id,
String name,
String email
) {}
// Java 21 Virtual Threads + Spring Boot 3.2+
spring.threads.virtual.enabled=trueSpring Framework & Spring Boot Versiyon Eşleşmesi
| Spring Boot | Spring Framework | Min Java | Jakarta/javax |
|---|---|---|---|
| 2.7.x | 5.3.x | Java 8 | javax.* |
| 3.0.x | 6.0.x | Java 17 | jakarta.* |
| 3.1.x | 6.0.x | Java 17 | jakarta.* |
| 3.2.x | 6.1.x | Java 17 | jakarta.* |
| 3.3.x | 6.1.x | Java 17 | jakarta.* |
| 3.4.x | 6.2.x | Java 17 | jakarta.* |
Kritik: Spring Boot 2.x → 3.x geçişi büyük bir sıçramadır.
javax.*→jakarta.*namespace değişikliği tüm import'ları etkiler.
Jakarta EE vs javax
Java EE, Oracle'dan Eclipse Foundation'a devredildiğinde Jakarta EE adını aldı. En önemli değişiklik namespace değişikliğidir:
// Spring Boot 2.x (javax)
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;
// Spring Boot 3.x (jakarta)
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotNull;Bu değişiklik mekanik ama kapsamlıdır — tüm dosyalarda find-and-replace yapmanız gerekir. IDE'lerin migration tool'ları bu işi kolaylaştırır.
GraalVM Native Image Desteği
Spring Boot 3.x ile birlikte GraalVM Native Image desteği resmi olarak geldi:
# Native image derleme (Spring Boot 3.x)
./mvnw -Pnative native:compile
# Sonuç: ~50MB binary, ~50ms başlatma süresi
# (Normal JVM: ~200MB, ~2-3s başlatma)Avantajları: Anında başlatma, düşük bellek kullanımı, container-friendly. Dezavantajları: Uzun derleme süresi, reflection kısıtlamaları, runtime sınıfı yükleme yok.
Ne zaman kullanılır: Serverless (AWS Lambda), CLI araçları, yüksek ölçekli mikroservisler.
Versiyon Seçim Rehberi
| Durum | Önerilen |
|---|---|
| Yeni proje başlıyorum | Spring Boot 3.3+ / Java 21 |
| Mevcut projem Java 8 | Önce Java 17'ye, sonra Boot 3.x'e geç |
| Performance kritik | Java 21 (virtual threads) + Boot 3.2+ |
| Serverless/Startup hızı | GraalVM native image + Boot 3.x |
Best Practices
İpucu: Yeni projelerde daima en güncel LTS Java versiyonunu (Java 21) ve en güncel Spring Boot versiyonunu kullanın.
Uyarı: Spring Boot 2.x artık resmi olarak desteklenmiyor (end of life). Güvenlik güncellemeleri almak için 3.x'e geçiş planlayın.
Özet
Java ve Spring versiyonlarını doğru eşleştirmek, projenizin stabilitesi ve güvenliği için kritik önem taşır. Spring Boot 3.x ile Jakarta EE'ye geçiş yapılmıştır ve Java 17 minimum gereksinimdir. GraalVM native image desteği ise modern bulut uygulamaları için heyecan verici imkânlar sunar.
AI Asistan
Sorularını yanıtlamaya hazır