Java Ortam ve Sistem Değişkenleri

Java üzerinde çalıştığı sistemin ortam değişkenlerine erişebildiği gibi JVM başlatılırken komut satırı ile verilen parametreleri de kullanabilir.

Bunlardan ilki yani ortam değişkenleri JVM başlatıldığı zamanki ortam değişkenlerinin değerlerine erişim imkanı verir. Buna örnek olarak


package com.datayaz.sample;

public class EnvTest {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("PATH=" + System.getenv("PATH"));
    }
}

Bu kodu çalıştırdığımızda şuna benzer bir çıktı alırız Ubuntu'da



Bu PATH ortam değişkeninin Java uygulaması başlatıldığındaki değeridir. Sonradan değişse bile o JVM'in gördüğü değer değişmez. Bunu ilgili metodun kaynak koduna bakarak anlayabiliriz.



Göreceğiniz üzere getenv metodu ProcessEnvironment sınıfının bilgisi ilk defa belleğe yüklenirken yani JVM açılırken bir kere tüm ortam değişkenlerini okuyup sonra onları bir haritanın içine atıyor ve o haritadan buluyor sorgulandığında.

Bunu eclipse'te test etmek isterseniz sistem ortam değişkenlerini ezebilirsiniz de




getenv metodu özellikle 12 Faktör Uygulama diye bahsedilen günümüzün en popüler mikro servis yaşam döngüsünün de Environment başlığı ile ilgili olarak kullanılır. Bu gereksinime göre bir mikro servis ayarlarını kodda tutmamalı ve ortamdan bekliyor olmalı. Yani getenv metodu ile almalı. Böylece aynı uygulama farklı ortamlarda farklı veritabanlarına bağlanabilir. Ayrıca gizlilik içeren bilgiler kodda tutulmadığında güvenlik riskleri en aza indirgenmiş olur.

Java parametreleri ise JVM'in ortam kendi ortam değişkenleridir. JVM bir sanal makina olarak düşünülürse dış ortamdan izole kendi bir iç ortamı bulunur ve bu ortam için parametreleri yine JVM ilk açılırken komut satırından verebiliriz.

En alt satıra şu kodu eklediğimizde:


System.out.println("JDBC_URL=" + System.getProperty("JDBC_URL"));

ve -D ile ilgili parametreyi komut satırından verdiğimizde Java uygulamasında bu parametreye erişebildiğimizi görebiliriz.



Böylece uygulamamız test ortamında local veritabanına canlı ortamında başka bir veritabanına bağlanabilir kodu tekrar derlemeye gerek kalmadan.

Bu iki yöntemi karşılaştırmak gerekirse web servislerde ve web uygulamalarda ilk yöntem ağır basar kanımca. Bir container a yüklenen web uygulamaları için container'ın yeni property komuta eklenecek şekilde baştan başlatılması sorun yaratabilir.Aynı şekilde bir bulut ortamına bu war dosyasını ya da spring boot uygulamasını yüklerken Java property lerini değiştirme şansımız pek olmayabilir.

İkinci yöntem ise masaüstü uygulamalarında ya da JVM'i kendimizin başlatabildiği ortamlarda daha kullanışlı bir yöntem olabilir çünkü sistem geneli ortam değişkenlerini değiştirmek yerine sadece o JVM'in o seferki çalışması için bu parametreleri değiştirme fırsatı verir bize.

Bunların dışında bir diğer parametre iletme yöntemi de komut satırı parametresi ya da bildiği adıyla argümanlardır. Uygulamanın main metoduna verilen String[] args parametresi işte dışarıdan uygulama çalıştırılırken sonuna eklenecek parametreleri gösterir. Bu yöntem ise daha çok betik (script) ile çağırmalar için daha kullanışlıdır diyebiliriz.

















Yorumlar

Popüler Yayınlar