Bu yazı içerisinde size bir Spring Boot uygulamasında uygulamanın kaynak kodu dışındaki bir yerde yer alan config dosyasının kullanımından bahsedeceğim.

Bildiğimiz gibi Spring Boot src/main/resources altında yer alan application.properties dosyası ile çok sayıda config tanımı yapıp kullanmaya imkan tanıyor. Örneğin Spring Data kullanımı sırasında veritabanı bağlantı bilgileri bu dosyada yer alıyor, mail gönderim işlemleri için tanımlanması gereken property’ler bu dosya içinde yer alıyor gibi.

Şimdi biz bir demo uygulama üzerinden önce kaynak kod içindeki application.properties dosyası ile uygulamayı ayağa kaldıracağız akabinde de harici lokasyondaki application.properties dosyası ile uygulamayı ayağa kaldıracağız.

Lokaldeki MySQL veritabanı sunucumda internaldb ve externaldb adında 2 adet veri tabanım var ve bu veri tabanları içerinde de Drivers adında bir tablom var. internaldb veri tabanı uygulama içi application.properties, externaldb de harici lokasyondaki application.properties için kullanılacak.

<figcaption>InternalDB içerisindeki Drivers tablosunda tutulan veriler</figcaption>

<figcaption>ExternalDB içerisindeki Drivers tablosunda tutulan veriler</figcaption>

Uygulamanın kaynak kodu içerisinde yer alan application.properties dosyası içeriği de şöyle:

hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/INTERNALDB?useUnicode=yes&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Bu application.properties dosyasından göreceğimiz gibi uygulama içi properties dosyası INTERNALDB’ye bağlantı sağlayacak.

Şimdi ben uygulamamı kaynak kod içerisinde yer alan Application.java sınıfı üzerinden başlatıyorum. http://localhost:8080/drivers/all adresine browser üerinden istek gönderdiğimde aşağıdaki ekran görüntüsünde de görebileceğimiz gibi INTERNALDB içerisinde yer alan Drivers tablosundaki kayıtlar geliyor.

<figcaption>INTERNAL içerisindeki Drivers tablosunda tutulan veriler ekrana geldi</figcaption>

Şimdi harici lokasyondaki dosya kullanımı için olarak pom.xml dosyası içerisinde build tag’i altında aşağıdaki resource tanımını yapıyoruz.

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>**/application.properties</exclude>
        </excludes>
    </resource>
</resources>

Bu işlem aslında zorunlu olduğumuz bir işlem değil fakat kaynak koddan elde edeceğimiz jar içerisinde kullanılmayan gereksiz bir dosyasının yer almaması için yapıyoruz bu işlemi.

Akabinde mvn clean install komutu ile bir jar çıkarıyoruz. Target dizini altına çıkan jar dosyasını istediğiniz herhangi bir yere kopyalayın. Ben Documents altında Spring Boot External Config Test adında bir klasöre kopyaladım.

Spring Boot uygulaması default olarak appliation.properties dosyasına jar ile aynı dizinde mi yoksa jar ile aynı dizinde yer alan config klasörü altında mı diye bakar. Şimdi biz Spring Boot External Config Test klasörü içine aşağıdaki içeriğe sahip bir application.properties dosyası koyalım.

hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/EXTERNALDB?useUnicode=yes&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Bu application.properties dosyasından göreceğimiz gibi harici properties dosyası EXTERNALDB’ye bağlantı sağlayacak.

Şimdi komut satırı üzerinden ilgili klasöre geliyorum ve java -jar SpringBootExternalConfiguration-1.0-SNAPSHOT.jar komutunu çalıştırıyorum.

<figcaption>Spring Boot uygulaması başarılı bir şekilde ayağa kalktı</figcaption>

Şimdi tekrar http://localhost:8080/drivers/all adresine gidelim ve ekrana gelen verileri kontrol edelim.

<figcaption>EXTERNAL içerisindeki Drivers tablosunda tutulan veriler ekrana geldi</figcaption>

Ekran görüntüsünden gördüğümüz gibi bize EXTERNALDB içerisinde yer alan kayıtlar getirildi. Eğer bunun yerine Spring Boot External Config Test klasörü içinde bir config klasörü oluşturup application.properties dosyasını oraya taşısaydık ve yeninden java -jar komutunu çalıştırsaydık yine uygulamamız başarılı bir şekilde çalışacaktı.

Peki bu noktada şöyle bir soru soralım. Bu şekilde jar’ın olduğu klasöre bağımlı kalmak istemiyorsak ne yapmalıyız?

Bu durumda da java -jar komutumuza ilave parametre geçerek sorunumuzu çözebiliriz. application.properties dosyasının Downloads klasörü altında olduğunu ve jar ile aynı dizinde bir properties dosyası olmadığını düşünürsek şu komut ile uygulamamızı ayağa kaldırabiliriz:

java -jar -Dspring.config.location=C:\Users\igunel\Downloads\application.properties SpringBootExternalConfiguration-1.0-SNAPSHOT.jar

-D komutu ile Java’ya parametre geçebiliyoruz ve yukarıdaki kısımda da spring.config.location parametresi ile uygulamaya Downloads klasörü altındaki application.properties dosyasını kullanarak ayağa kalkmasını söylüyoruz.

Bu işlemin yanında eğer uygulamamız birden fazla properties dosyası kullanıyorsa ve biz de onları komut satırından geçirmek istersek şu komut ile name ve location ayrıştırması yapabiliriz:

java -jar -Dspring.config.name=application,jdbc -Dspring.config.location=C:\Users\igunel\Downloads\ SpringBootExternalConfiguration-1.0-SNAPSHOT.jar

Yukarıdaki komutumuzda spring.config.name parametresine application ve jdbc property isimlerini veriyoruz. Bu noktada bizim application.properties ve jdbc.properties isminde iki dosyamız olduğunu düşünebiliriz. Akabinde spring.config.location paramtresine bu application ve jdbc property dosyalarının yer aldığı klasörü veriyoruz. Böylece uygulamamız C:\Users\igunel\Downloads\ klasörünü tarayıp application ve jdbc property dosyalarını alıyor. Ardından da bu dosyalardaki bilgiler ile uygulama ayağa kalkıyor.

Bu yazıda anlatacağım da bu kadar arkadaşlar.

Başka yazıda görüşene kadar sağlıcakla kalın.