Spring Boot Uygulamalarını Üretime Taşımak: WAR, JAR ve Bulut Dağıtımı

Spring Boot ile uygulama geliştirmek keyifli, hızlı ve üretken bir süreç sunar. Ancak oyunun asıl kritik noktası, yazdığınız uygulamayı üretim ortamına (production) taşımaktır. Geliştirme ortamında çalışan bir proje, doğru dağıtım stratejisi yoksa gerçek kullanıcılarla buluşamaz. Bu yazıda WAR/JAR seçimi, uygulama sunucusuna deploy, veritabanı migrasyonu ve Cloud Foundry / Heroku dağıtımı gibi konulara odaklanacağız.

Neden Dağıtım (Deploy) Stratejisi Önemli?

Geliştirme sırasında genelde şu yöntemlerle Spring Boot uygulamasını çalıştırırız:

  • IDE içinden doğrudan çalıştırmak
  • mvn spring-boot:run veya gradle bootRun komutlarını kullanmak
  • Çalıştırılabilir (executable) JAR üretip komut satırından çalıştırmak
  • Spring Boot CLI ile Groovy script’leri çalıştırmak

Bunların hepsi geliştirme aşaması için ideal. Ancak üretim ortamına geçtiğimizde:

  • IDE’den çalıştırmak kesinlikle uygun değildir.
  • Executable JAR, modern mimariler ve bulut için oldukça uygundur.
  • Geleneksel uygulama sunucuları (Tomcat, WebSphere, WebLogic) için ise hâlâ WAR dosyası gereklidir.

WAR mı, Executable JAR mı? Hangisini Ne Zaman Kullanmalıyım?

Spring Boot, esnek bir paketleme yapısına sahiptir. Aşağıdaki tablo genel bir fikir verebilir:

Artifact Tipik Hedef Ortam
Executable JAR Bulut ortamları (Cloud Foundry, Heroku), Docker konteynerleri, modern microservice mimarileri
WAR Geleneksel Java uygulama sunucuları (Tomcat, WebSphere, WebLogic)

Kısaca: Mevcut bir uygulama sunucu altyapınız varsa WAR, konteyner veya buluta gidiyorsanız JAR genelde daha mantıklı bir seçimdir.

Spring Boot Uygulamasını WAR Olarak Paketleyip Uygulama Sunucusuna Deploy Etmek

Spring Boot projeleri varsayılan olarak executable JAR üretir. Ancak birkaç küçük değişiklikle projeyi kolayca WAR üreten bir yapıya dönüştürebiliriz.

1. Build Yapılandırmasını WAR Üretecek Şekilde Güncelleyin

Gradle için:

apply plugin: 'war'

war {
    baseName = 'readinglist'
    version  = '0.0.1-SNAPSHOT'
}
    

Maven için:

<packaging>war</packaging>
    

2. SpringBootServletInitializer ile Servlet Initializer Yazın

Uygulama sunucusunun Spring Boot uygulamamızı nasıl başlatacağını belirtmek için SpringBootServletInitializer sınıfından türeyen bir sınıfa ihtiyacımız var:

public class ReadingListServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}
    

Sonrasında gradle build veya mvn package ile üretilen WAR dosyasını Tomcat’in webapps klasörüne kopyalayarak deploy edebilirsiniz.

Geliştirmeden Üretime: H2’den PostgreSQL’e Geçiş ve Migrasyon

Geliştirme ortamında H2 gibi gömülü veritabanları oldukça kullanışlıdır. Ancak üretim ortamında:

  • Veriniz kalıcı ve güvenli olmalıdır.
  • Schema değişiklikleri kontrollü şekilde yönetilmelidir.

Bu noktada iki önemli araç devreye girer:

  • Flyway: SQL script tabanlı, versiyon numarasıyla çalışan basit migrasyon aracı.
  • Liquibase: XML / YAML / JSON ile platformdan bağımsız migrasyon tanımlamaya izin verir.

Uygulamanın ilk deploy’unda tablo ve başlangıç verileri bu migrasyon araçları ile oluşturulur. Sonraki deploy’larda sadece eksik olan script’ler çalıştırılır; böylece veri kaybı olmadan schema’yı geliştirebilirsiniz.

Spring Boot Uygulamasını Cloud Foundry’ye Deploy Etmek

Cloud Foundry, PaaS (Platform as a Service) yaklaşımıyla Spring Boot uygulamalarını oldukça kolay şekilde çalıştırmanızı sağlar. Üstelik:

  • Executable JAR, WAR veya Groovy script olarak deploy destekler.
  • Marketplace üzerinden PostgreSQL gibi veritabanı servislerine bağlanabilirsiniz.
  • Otomatik ölçekleme ve yönetim avantajları sunar.

Basit bir deploy örneği (WAR ile):

cf login -a https://api.run.pivotal.io
cf push my-readinglist -p build/libs/readinglist.war
    

Sonrasında bir PostgreSQL servisi oluşturup uygulamaya bağlayabilir ve embedded H2 yerine gerçek bir veritabanı kullanabilirsiniz.

Spring Boot Uygulamasını Heroku’ya Deploy Etmek

Heroku, Spring Boot için sık kullanılan bir diğer PaaS platformudur. Dağıtım mantığı Cloud Foundry’den biraz farklıdır:

  • Her proje için bir Git deposu oluşturulur.
  • Her git push heroku master sonrası Heroku projeyi build edip deploy eder.
  • Başlatma komutunu Procfile dosyasında belirtirsiniz.

Örnek bir Procfile satırı:

web: java -Dserver.port=$PORT -jar build/libs/readinglist.war
    

Heroku Postgres eklentisi ile bir veritabanı ekleyebilir ve Spring Cloud Connectors ile, ortam değişkenlerinden veritabanı bilgilerini otomatik okuyarak DataSource’u doğru şekilde yapılandırabilirsiniz.

Sonuç: Geliştirdiğinizi Mutlaka Üretime Taşıyın

Spring Boot, sadece geliştirme aşamasını hızlandırmakla kalmaz; deploy aşamasını da oldukça esnek ve güçlü hale getirir. Özetle:

  • Geleneksel uygulama sunucuları için WAR + SpringBootServletInitializer.
  • Bulut ve konteyner dünyası için executable JAR.
  • Schema yönetimi için Flyway veya Liquibase.
  • Cloud Foundry ve Heroku ile hızlı, ölçeklenebilir dağıtımlar.

Bir sonraki adımınız, geliştirdiğiniz Spring Boot uygulamasını bu tekniklerden birini seçerek gerçek bir ortama taşımak olabilir. Böylece sadece kod yazmış olmaz, değer üreten bir ürün ortaya koymuş olursunuz.

Mutlu deploy’lar! 🚀

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *