Java System.getProperty vs System.getenv

1. Introduktion

Pakken java.lang importeres automatisk, når det er i et Java-program. Denne pakke indeholder mange almindeligt anvendte klasser fra NullPointerException til Objekt, Matematikog Snor.

Det java.lang.System klasse er en endelig klasse, hvilket betyder at vi ikke kan underklasse det, derfor er alle metoder statisk.

Vi vil se på forskellene mellem to System metoder til læsning af systemegenskaber og miljøvariabler.

Disse metoder er getProperty og getenv.

2. Brug System.getProperty ()

Java-platformen bruger en Ejendomme mod at levere oplysninger om det lokale system og konfiguration og vi kalder det Systemegenskaber.

Systemegenskaber inkluderer oplysninger såsom den aktuelle bruger, den aktuelle version af Java-runtime og filsti-navneparator.

I nedenstående kode bruger vi System.getProperty (“log_dir”) for at læse ejendommens værdi log_dir. Vi bruger også standardværdiparameteren, så hvis ejendommen ikke findes, getProperty returnering af /tmp/ log:

String log_dir = System.getProperty ("log_dir", "/ tmp / log"); 

Brug metoden for at opdatere systemegenskaber ved kørsel System.setProperty metode:

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

Vi kan videregive vores egne egenskaber eller konfigurationsværdier til applikationen ved hjælp af ejendomsnavn kommandolinjeargument i formatet:

java -jar jarName -DpropertyName = værdi

Indstilling af ejendom for foo med en værdi af bar i app.jar:

java -jar app -Dfoo = "bar"

System.getProperty vil altid returnere en Snor.

3. Brug System.getenv ()

Miljøvariabler er nøgle / værdipar som Ejendomme. Mange operativsystemer bruger miljøvariabler, så konfigurationsoplysninger overføres til applikationer.

Måden at indstille en miljøvariabel på varierer fra det ene operativsystem til det andet. For eksempel i Windows bruger vi et System Utility-program fra kontrolpanelet, mens vi i Unix bruger shell-scripts.

Når du opretter en proces, arver den som standard et klonmiljø fra sin overordnede proces.

Følgende kodestykke viser brug af et lambda-udtryk til at udskrive alle miljøvariabler.

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

getenv () returnerer en skrivebeskyttet Kort. Forsøger at tilføje værdier til kortet kaster en Ikke-understøttetOperationException.

Ring for at få en enkelt variabel getenv med variabelnavnet:

String log_dir = System.getenv ("log_dir");

På den anden side kan vi oprette en anden proces fra vores applikation og tilføje nye variabler til miljøet.

For at oprette en ny proces i Java bruger vi ProcessBuilder klasse, der har en metode kaldet miljø. Denne metode returnerer a Kort men denne gang er kortet ikke skrivebeskyttet, hvilket betyder, at vi kan tilføje elementer til det:

ProcessBuilder pb = ny ProcessBuilder (args); Kort env = pb.environment (); env.put ("log_dir", "/ tmp / log"); Process proces = pb.start ();

4. Forskellene

Selvom begge i det væsentlige er kort, der giver Snor værdier for Snor nøgler, lad os se på et par forskelle:

  1. Vi kan opdatere egenskaber ved kørsel, mens miljøvariabler er en uforanderlig kopi af operativsystemets variabler.
  2. Egenskaber er kun indeholdt i Java-platformen, mens miljøvariabler er globale på operativsystemniveau - tilgængelige for alle applikationer, der kører på den samme maskine.
  3. Egenskaber skal eksistere, når applikationen emballeres, men vi kan oprette miljøvariabler på operativsystemet på næsten ethvert tidspunkt.

5. Konklusion

Selvom konceptuelt ens, er anvendelsen af ​​både egenskaber og miljøvariabler meget anderledes.

Valget mellem mulighederne er ofte et spørgsmål om omfang. Ved hjælp af miljøvariabler kan den samme applikation distribueres til flere maskiner til at køre forskellige forekomster og kan konfigureres på operativsystemniveau eller endda i AWS eller Azure Consoles. Fjernelse af behovet for at genopbygge applikationen for at opdatere config.

Husk altid det getProperty følger camel-case konvention og getenv gør ikke.