Java System.getProperty vs System.getenv

1. Einleitung

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

Die java.lang.System -Klasse ist eine final -Klasse. Dies bedeutet, dass wir keine Instanz davon erstellen können. Daher sind alle Methoden static .

Wir werden die Unterschiede zwischen zwei System -Methoden für das Lesen von Systemeigenschaften und Umgebungsvariablen betrachten. **

Diese Methoden sind getProperty und getenv .

2. Verwenden von System.getProperty ()

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

Zu den Systemeigenschaften gehören Informationen wie der aktuelle Benutzer, die aktuelle Version der Java-Laufzeitumgebung 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 verwenden auch den Standardwertparameter. Wenn die Eigenschaft nicht vorhanden ist, gibt getProperty Folgendes zurück: _/ tmp /log_ :

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

Verwenden Sie zum Aktualisieren der Systemeigenschaften zur Laufzeit die Methode System.setProperty -Methode:

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

Wir können unsere eigenen Eigenschaften oder Konfigurationswerte mit dem Befehlszeilenargument propertyName im Format 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. **

    1. Verwendung von System.getenv ()

  • Umgebungsvariablen sind Schlüssel/Wert-Paare wie Properties . ** Viele Betriebssysteme verwenden Umgebungsvariablen, um Konfigurationsinformationen an Anwendungen übergeben zu können.

Die Art und Weise, wie eine Umgebungsvariable festgelegt wird, unterscheidet sich von Betriebssystem zu Betriebssystem. In Windows verwenden wir z. B. eine Systemdienstprogrammanwendung aus der Systemsteuerung, während in Unix Shell-Skripts verwendet werden.

  • Beim Erstellen eines Prozesses erbt er standardmäßig eine Klonumgebung des übergeordneten Prozesses. **

Der folgende Codeausschnitt 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, Werte zur Karte 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");

Andererseits können wir aus unserer Anwendung einen anderen Prozess erstellen und seiner Umgebung neue Variablen hinzufügen.

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

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

4. Die Unterschiede

Obwohl beide im Wesentlichen Maps sind, die String -Werte für String -Schlüssel enthalten, sollten wir uns einige Unterschiede ansehen:

  1. Wir können Eigenschaften zur Laufzeit aktualisieren, während Umgebungsvariablen eine sind

unveränderliche Kopie der Variablen des Betriebssystems.

  1. Eigenschaften sind nur in der Java-Plattform während der Umgebung enthalten

Variablen sind auf Betriebssystemebene global - für alle Anwendungen verfügbar, die auf demselben Computer ausgeführt werden.

  1. Eigenschaften müssen beim Packen der Anwendung vorhanden sein, aber wir können sie erstellen

Umgebungsvariablen auf dem Betriebssystem an fast jeder Stelle.

5. Schlussfolgerung

Obwohl konzeptionell ähnlich, sind die Eigenschaften von Eigenschaften und Umgebungsvariablen recht unterschiedlich.

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

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