Java System.getProperty vs System.getenv

1. Úvod

Balík java.lang sa automaticky importuje, keď je v aplikácii Java. Tento balík obsahuje mnoho bežne používaných tried z NullPointerException do Objekt, Matematikaa String.

The java.lang.System trieda je a konečné triedy, čo znamená, že ju nemôžeme podtriediť, preto sú všetky metódy statický.

Ideme sa pozrieť na rozdiely medzi dvoma Systém metódy pre čítanie vlastností systému a premenných prostredia.

Tieto metódy sú getProperty a getenv.

2. Pomocou System.getProperty ()

Platforma Java používa a Vlastnosti objekt poskytnúť informácie o lokálnom systéme a konfigurácii a my tomu hovoríme Vlastnosti systému.

Vlastnosti systému obsahujú informácie, ako napríklad aktuálny používateľ, aktuálna verzia modulu runtime Java a oddeľovač názvu cesty k súboru.

V nižšie uvedenom kóde používame System.getProperty („log_dir“) prečítať hodnotu nehnuteľnosti log_dir. Používame tiež parameter predvolenej hodnoty, takže ak vlastnosť neexistuje, getProperty výnosy z /tmp/ log:

Reťazec log_dir = System.getProperty ("log_dir", "/ tmp / log"); 

Ak chcete aktualizovať vlastnosti systému za behu, použite túto metódu System.setProperty metóda:

System.setProperty ("log_dir", "/ tmp / log");

Môžeme odovzdať vlastné hodnoty vlastností alebo konfigurácií do aplikácie pomocou propertyName argument príkazového riadku vo formáte:

java -jar jarName -DpropertyName = hodnota

Nastavenie vlastnosti foo s hodnotou baru v app.jar:

java -jar app -Dfoo = "bar"

System.getProperty vždy vráti a String.

3. Používanie System.getenv ()

Premenné prostredia sú podobné párom kľúč / hodnota Vlastnosti. Mnoho operačných systémov používa premenné prostredia na to, aby umožnili prenos informácií o konfigurácii do aplikácií.

Spôsob nastavenia premennej prostredia sa v jednotlivých operačných systémoch líši. Napríklad v systéme Windows používame aplikáciu System Utility z ovládacieho panela, zatiaľ čo v systéme Unix používame shell skripty.

Pri vytváraní procesu predvolene dedí klonové prostredie svojho nadradeného procesu.

Nasledujúci úryvok kódu ukazuje použitie výrazu lambda na vytlačenie všetkých premenných prostredia.

System.getenv (). ForEach ((k, v) -> {System.out.println (k + ":" + v);}); 

getenv () vráti iba na čítanie Mapa. Pokus o pridanie hodnôt do mapy vyvolá znak UnsupportedOperationException.

Ak chcete získať jednu premennú, zavolajte getenv s názvom premennej:

Reťazec log_dir = System.getenv ("log_dir");

Na druhej strane môžeme z našej aplikácie vytvoriť ďalší proces a do jeho prostredia pridať nové premenné.

Na vytvorenie nového procesu v Jave používame ProcessBuilder triedy, ktorá má metódu nazvanú prostredie. Táto metóda vracia a Mapa ale tentoraz mapa nie je iba na čítanie, čo znamená, že do nej môžeme pridávať prvky:

ProcessBuilder pb = nový ProcessBuilder (args); Mapa env = pb.environment (); env.put ("log_dir", "/ tmp / log"); Proces proces = pb.start ();

4. Rozdiely

Aj keď obe sú v podstate mapy, ktoré poskytujú String hodnoty pre String kľúče, pozrime sa na niekoľko rozdielov:

  1. Vlastnosti môžeme aktualizovať za behu, zatiaľ čo premenné prostredia sú nemennou kópiou premenných operačného systému.
  2. Vlastnosti sú obsiahnuté iba v rámci platformy Java, zatiaľ čo premenné prostredia sú globálne na úrovni operačného systému - k dispozícii pre všetky aplikácie spustené na rovnakom stroji.
  3. Pri zabalení aplikácie musia existovať vlastnosti, ale v operačnom systéme môžeme vytvoriť premenné prostredia takmer kedykoľvek.

5. Záver

Aj keď sú koncepčne podobné, použitie oboch premenných Vlastnosti a Environment je dosť odlišné.

Výber medzi týmito možnosťami je často otázkou rozsahu. Pomocou premenných prostredia je možné rovnakú aplikáciu nasadiť na viac počítačov na spustenie rôznych inštancií a možno ju nakonfigurovať na úrovni operačného systému alebo dokonca v konzolách AWS alebo Azure. Odstraňuje sa potreba opätovného zostavenia aplikácie na aktualizáciu konfigurácie.

Vždy si to zapamätajte getProperty sa riadi dohovorom o ťavách a getenv nie.


$config[zx-auto] not found$config[zx-overlay] not found