Java System.getProperty vs System.getenv

1. Einleitung

Das Paket java.lang wird in einer Java-Anwendung automatisch importiert. Dieses Paket enthält viele häufig verwendete Klassen von NullPointerException bis Object , Math und String .

Die java.lang.System- Klasse ist eine letzte Klasse, was bedeutet, dass wir sie nicht unterordnen können, daher sind alle Methoden statisch .

Wir werden die Unterschiede zwischen zwei Systemmethoden zum Lesen von Systemeigenschaften und Umgebungsvariablen untersuchen.

Diese Methoden sind getProperty und getenv .

2. Verwenden von System.getProperty ()

Die Java-Plattform verwendet ein Eigenschaftenobjekt , um Informationen über das lokale System und die Konfiguration bereitzustellen, und wir nennen es Systemeigenschaften .

Zu den Systemeigenschaften gehören Informationen wie der aktuelle Benutzer, die aktuelle Version der Java-Laufzeit und das Trennzeichen für den Dateipfadnamen.

Im folgenden Code verwenden wir System.getProperty ("log_dir") , um den Wert der Eigenschaft log_dir zu lesen . Wir auch den Standardwert Parameter machen , damit , wenn die Eigenschaft nicht vorhanden ist , getProperty kehrt von / tmp / log :

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

Verwenden Sie die Methode System.setProperty , um die Systemeigenschaften zur Laufzeit zu aktualisieren :

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

Mit dem Befehlszeilenargument propertyName im Format können wir unsere eigenen Eigenschaften- oder Konfigurationswerte an die Anwendung übergeben :

java -jar jarName -DpropertyName=value

Festlegen der Eigenschaft von foo mit dem Wert bar in app.jar:

java -jar app -Dfoo="bar"

System.getProperty gibt immer einen String zurück .

3. Verwenden von System.getenv ()

Umgebungsvariablen sind Schlüssel / Wert-Paare wie Eigenschaften. Viele Betriebssysteme verwenden Umgebungsvariablen, damit Konfigurationsinformationen an Anwendungen übergeben werden können.

Die Art und Weise, wie eine Umgebungsvariable festgelegt wird, ist von Betriebssystem zu Betriebssystem unterschiedlich. Unter Windows verwenden wir beispielsweise eine Systemdienstprogrammanwendung über die Systemsteuerung, während wir unter Unix Shell-Skripte verwenden.

Beim Erstellen eines Prozesses erbt er standardmäßig eine Klonumgebung seines übergeordneten Prozesses.

Das folgende Codefragment zeigt die Verwendung eines Lambda-Ausdrucks zum Drucken aller Umgebungsvariablen.

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

getenv () gibt eine schreibgeschützte Map zurück. Beim Versuch, der Karte Werte hinzuzufügen, wird eine UnsupportedOperationException ausgelöst .

Um eine einzelne Variable zu erhalten, rufen Sie getenv mit dem Variablennamen auf:

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

Auf der anderen Seite können wir aus unserer Anwendung einen weiteren Prozess erstellen und der Umgebung neue Variablen hinzufügen.

Um einen neuen Prozess in Java zu erstellen, verwenden wir die ProcessBuilder- Klasse mit einer Methode namens environment . Diese Methode gibt eine Karte zurück, aber diesmal ist die Karte nicht schreibgeschützt, was bedeutet, dass wir ihr Elemente hinzufügen können:

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

4. Die Unterschiede

Obwohl es sich bei beiden im Wesentlichen um Maps handelt, die String- Werte für String- Schlüssel bereitstellen , sehen wir uns einige Unterschiede an:

  1. Wir können Eigenschaften zur Laufzeit aktualisieren, während Umgebungsvariablen eine unveränderliche Kopie der Variablen des Betriebssystems sind.
  2. Eigenschaften sind nur in der Java-Plattform enthalten, während Umgebungsvariablen auf Betriebssystemebene global sind - verfügbar für alle Anwendungen, die auf demselben Computer ausgeführt werden.
  3. Beim Packen der Anwendung müssen Eigenschaften vorhanden sein, aber wir können zu fast jedem Zeitpunkt Umgebungsvariablen auf dem Betriebssystem erstellen.

5. Schlussfolgerung

Obwohl konzeptionell ähnlich, ist die Anwendung von Eigenschaften und Umgebungsvariablen sehr unterschiedlich.

Die Wahl zwischen den Optionen ist oft eine Frage des Umfangs. Mithilfe von Umgebungsvariablen kann dieselbe Anwendung auf mehreren Computern bereitgestellt werden, um unterschiedliche Instanzen auszuführen, und sie kann auf Betriebssystemebene oder sogar in AWS- oder Azure-Konsolen konfiguriert werden. Entfernen der Notwendigkeit, die Anwendung neu zu erstellen, um die Konfiguration zu aktualisieren.

Denken Sie immer daran, dass getProperty der Kamelfallkonvention folgt und getenv nicht.