Java System.getProperty vs System.getenv

1. Introduzione

Il pacchetto java.lang viene importato automaticamente quando si trova in un'applicazione Java. Questo pacchetto contiene molte classi di uso comune da NullPointerException a Object , Math e String .

La classe java.lang.System è una classe finale , il che significa che non possiamo sottoclassarla, quindi tutti i metodi sono statici .

Esamineremo le differenze tra due metodi di sistema per la lettura delle proprietà di sistema e delle variabili di ambiente.

Questi metodi sono getProperty e getenv .

2. Utilizzo di System.getProperty ()

La piattaforma Java utilizza un oggetto Properties per fornire informazioni sul sistema locale e sulla configurazione e lo chiamiamo System Properties .

Le proprietà del sistema includono informazioni quali l'utente corrente, la versione corrente del runtime Java e il separatore del nome del percorso del file.

Nel codice seguente, utilizziamo System.getProperty ("log_dir") per leggere il valore della proprietà log_dir . Facciamo anche uso del parametro del valore predefinito, quindi se la proprietà non esiste, getProperty restituisce / tmp / log :

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

Per aggiornare le proprietà del sistema in fase di esecuzione, utilizzare il metodo System.setProperty :

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

Possiamo passare le nostre proprietà o valori di configurazione all'applicazione utilizzando l' argomento della riga di comando propertyName nel formato:

java -jar jarName -DpropertyName=value

Impostazione della proprietà di foo con un valore di bar in app.jar:

java -jar app -Dfoo="bar"

System.getProperty restituirà sempre una stringa .

3. Utilizzo di System.getenv ()

Le variabili d'ambiente sono coppie chiave / valore come Proprietà. Molti sistemi operativi utilizzano variabili di ambiente per consentire il passaggio delle informazioni di configurazione alle applicazioni.

Il modo per impostare una variabile di ambiente è diverso da un sistema operativo all'altro. Ad esempio, in Windows, utilizziamo un'applicazione System Utility dal pannello di controllo mentre in Unix utilizziamo script di shell.

Quando si crea un processo, per impostazione predefinita eredita un ambiente clone del suo processo genitore.

Il frammento di codice seguente mostra l'utilizzo di un'espressione lambda per stampare tutte le variabili di ambiente.

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

getenv () restituisce una mappa di sola lettura . Il tentativo di aggiungere valori alla mappa genera un'eccezione UnsupportedOperationException .

Per ottenere una singola variabile, chiama getenv con il nome della variabile:

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

D'altra parte, possiamo creare un altro processo dalla nostra applicazione e aggiungere nuove variabili al suo ambiente.

Per creare un nuovo processo in Java, utilizziamo la classe ProcessBuilder che ha un metodo chiamato ambiente . Questo metodo restituisce una mappa ma questa volta la mappa non è di sola lettura, il che significa che possiamo aggiungere elementi ad essa:

ProcessBuilder pb = new ProcessBuilder(args); Map env = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();

4. Le differenze

Sebbene entrambe siano essenzialmente mappe che forniscono valori String per le chiavi String , diamo un'occhiata ad alcune differenze:

  1. Possiamo aggiornare le proprietà in fase di esecuzione mentre le variabili di ambiente sono una copia immutabile delle variabili del sistema operativo.
  2. Le proprietà sono contenute solo nella piattaforma Java, mentre le variabili d'ambiente sono globali a livello di sistema operativo, disponibili per tutte le applicazioni in esecuzione sulla stessa macchina.
  3. Le proprietà devono esistere durante la creazione del pacchetto dell'applicazione, ma possiamo creare variabili di ambiente sul sistema operativo in quasi ogni momento.

5. conclusione

Sebbene concettualmente simili, l'applicazione di Proprietà e Variabili d'ambiente è piuttosto diversa.

La scelta tra le opzioni è spesso una questione di portata. Utilizzando le variabili di ambiente, la stessa applicazione può essere distribuita su più macchine per eseguire istanze diverse e può essere configurata a livello di sistema operativo o anche in AWS o Azure Console. Rimozione della necessità di ricostruire l'applicazione per aggiornare config.

Ricorda sempre che getProperty segue la convenzione del caso dei cammelli e getenv no.