Umgebungsvariablen in Java verwenden

October 11, 2021
Autor:in:
Prüfer:in:

Arbeiten mit Umgebungsvariablen in Java

Umgebungsvariablen sind eine hervorragende Möglichkeit, Java-Anwendungen zu konfigurieren, ohne Einstellungen explizit in Code speichern zu müssen, z. B. für Datenbank- und Caching-Server oder für APIs von Drittanbietern.

Solche Einstellungen außerhalb des Codes vorzunehmen hat mehrere eindeutige Vorteile:

  • Bei Änderungen der Einstellungen muss der Code nicht aktualisiert und erneut kompiliert werden.
  • Die Offenlegung sensibler Anmeldeinformationen wie Benutzernamen und Passwörter sowie von Tokens wird verhindert.
  • Derselbe Code kann in mehreren Umgebungen bereitgestellt werden.

In diesem kurzen Artikel werde ich Ihnen einige der Möglichkeiten zeigen, wie Sie mit Umgebungsvariablen in Java arbeiten können.

Zugriff auf Umgebungsvariablen in Java

Eine der häufigsten Methoden ist die Verwendung von System.getenv(), die ein optionales Argument des Typs String akzeptiert. Je nachdem, ob ein Argument des Typs Stringübergeben wird, werden unterschiedliche Werte von der Methode zurückgegeben. Genauer:

Wenn ein String übergeben wird und er mit einem Schlüssel in der Map der internen Umgebung übereinstimmt, wird dessen Wert zurückgegeben. Wenn kein übereinstimmender Schlüssel gefunden wird, wird null zurückgegeben. Wenn kein Argument des Typs String übergeben wird, wird eine schreibgeschützte java.util.Map zurückgegeben, die alle Umgebungsvariablen und deren Werte enthält. Die Schlüssel der Map sind die Namen der Umgebungsvariablen, und ihre Werte sind deren Werte.

Denken Sie daran, dass verschiedene Plattformen auf unterschiedliche Weise funktionieren, z. B. wird bei Umgebungsvariablen unter UNIX, Linux und macOS zwischen Groß- und Kleinschreibung unterschieden, bei Microsoft Windows dagegen nicht.

Unten sehen Sie ein Beispiel, wie Sie die Methode zum Abrufen der Umgebungsvariable SHELL (die die Shell des Benutzers enthält) unter Linux verwenden können.

package com.settermjd.twilio.envvars;

public class Main {
    public static void main(String[] args) {
        System.out.println(
            String.format("The current shell is: %s.", System.getenv("SHELL"))
        );
    }
}

Wenn Sie einen Standardwert angeben möchten, rufen Sie System.genenv() wie folgt auf:

System.getenv().getOrDefault("SHELL", "/bin/bash")

Setzen von Umgebungsvariablen

Neben dem Lesen von Umgebungsvariablen kann es auch hilfreich sein zu wissen, wie sie gesetzt werden können. Ich werde nicht zu sehr ins Detail gehen, sondern mich auf das Wesentliche konzentrieren. Wenn Sie mehr darüber erfahren möchten, können Sie den ausführlichen Blogbeitrag von Dominik Kundel zu diesem Thema lesen.

UNIX, Linux und macOS

Unter UNIX, Linux und macOS können Umgebungsvariablen im Wesentlichen auf drei Arten festgelegt werden.

Verfügbar für die aktuelle Sitzung und alle untergeordneten Prozesse

Sie können Umgebungsvariablen so initialisieren, dass sie für die aktuelle Sitzung verfügbar sind, sowohl für die aktuelle Sitzung als auch für alle in der aktuellen Sitzung gestarteten Sitzungen und Prozesse, indem Sie den integrierten Export-Befehl wie im folgenden Beispiel verwenden.

export USER_ID=1

Die Umgebungsvariable wird auf diese Weise nicht dauerhaft festgelegt. Wenn Sie eine Umgebungsvariable dauerhaft festlegen möchten, müssen Sie sie entweder in der systemweiten Startdatei /etc/profile oder in einer der benutzerspezifischen Startdateien festlegen, also ~/.bash_profile, ~/.bash_login und ~/.profile.

Verfügbar für die aktuelle Sitzung

Sie können eine Umgebungsvariable so initialisieren, dass sie wie im folgenden Beispiel für die aktuelle Sitzung, aber nicht für untergeordnete Prozesse verfügbar ist, indem Sie nicht den Befehl export verwenden.

USER_ID=1

Verfügbar für einen bestimmten Prozess

Außerdem können Sie eine Umgebungsvariable so initialisieren, dass sie nur für einen bestimmten Prozess verfügbar ist. Dies ist hilfreich, wenn nur dieser Prozess die Variable benötigt. Sie können sie wie im folgenden Beispiel initialisieren, wenn Sie den gewünschten Prozess starten.

USER_ID=1 retrieveUserDetails

Microsoft Windows

Das Festlegen von Umgebungsvariablen funktioniert in Microsoft Windows ein wenig anders. Sie können sie über die Systemsteuerung, die Eingabeaufforderung oder die PowerShell-Konsole festlegen. Nachfolgend finden Sie Beispiele für die beiden letztgenannten Verfahren.

# Set USER_ID in the Windows Command Prompt
set USER_ID=1

# Set USER_ID in the Windows PowerShell console
$Env:USER_ID = 1

Verwenden von env-Dateien

Es kann zwar sehr effektiv sein, Umgebungsvariablen auf diese Weise festzulegen, es kann aber auch recht schnell umständlich werden. Wenn die Variablen beispielsweise in der Shell des Betriebssystems festgelegt werden, gibt es keine Liste der Variablen, die die Anwendung benötigt, und es sind auch keine Informationen darüber verfügbar, wofür eine Variable verwendet wird oder welchen Datentyp sie haben muss.

Unter anderem aus diesem Grund empfiehlt das 12-Factor-App-Manifest eine strikte Trennung von Konfigurierung und Code. Diese Praxis hat sich in der gesamten Entwicklergemeinschaft rasch durchgesetzt, und gewöhnlich werden env-Dateien verwendet. Hierbei handelt es sich um reine Textdateien, die eine Liste von Schlüssel-Wert-Paaren speichern und damit die Umgebungsvariablen definieren, die erforderlich sind, damit eine Anwendung funktioniert, so wie im folgenden Beispiel.

USER_ID=1
TWILIO_AUTH_TOKEN=1234567890987654321

Um den Einstieg in ein Projekt zu vereinfachen, wurde eine weitere gängige Praxis entwickelt, nämlich die Aufnahme einer env.example-Datei in ein Projekt, die alle Schlüssel, aber nicht deren Werte enthält. Wenn ein neuer Entwickler mit der Arbeit an der Anwendung begann, kopierte er die Datei, benannte sie in env um und legte Werte für jeden Schlüssel fest, der für seine lokale Entwicklungsumgebung relevant ist.

Lesen von env-Dateien

Wenn wir davon ausgehen, dass das obige Beispiel die env-Datei für unser Projekt war, könnten wir ein Paket wie dotenv-java verwenden, um die Variablen unserer Anwendung zur Verfügung zu stellen.

Wenn Sie in Kotlin entwickeln, können Sie dotenv-kotlin verwenden.

Im Codebeispiel unten sehen Sie ein Beispiel für die Verwendung des Pakets.

package com.settermjd.twilio.envvars;

import io.github.cdimascio.dotenv.Dotenv;
import io.github.cdimascio.dotenv.DotenvException;

public class Main {
    public static void main(String[] args) {
        Dotenv dotenv = null;
        dotenv = Dotenv.configure().load();
        System.out.println(String.format(
            "Hello World. Shell is: %s. Name is: %s",
            System.getenv("SHELL"),
            dotenv.get("NAME")
        ));
    }
}

Der Code initialisiert ein neues Dotenv-Objekt, „dotenv“, und ruft Dotenv.configure().load() auf, um die Umgebungsvariablen in der env-Datei im Stammverzeichnis des Projekts zu lesen. Anschließend wird dotenv.get() verwendet, um den Wert des String-Objekts abzurufen, das übergeben wurde. Wenn kein übereinstimmender Schlüssel gefunden wird, gibt die Methode null zurück.

 

Sie können bei Bedarf einen Standardwert als zweites Argument für die Methode angeben.

Ein Hinweis zur Sicherheit der env-Datei

Wenn sensible Daten in der env-Datei gespeichert werden, ist zu beachten, dass die Datei nicht mit Versionsverwaltungssoftware, wie beispielsweise Git, gespeichert werden darf. Wenn das passiert, gehen alle Sicherheitsvorteile der Verwendung von dotenv-Dateien verloren. Aus diesem Grund ist es üblich, sie von der Versionierung auszuschließen, z. B. indem Sie .env (und Variationen des Dateinamens) zur gitignore-Datei eines Projekts hinzufügen, wenn Sie Git verwenden.

So arbeiten Sie mit Umgebungsvariablen in Java.

Ich hoffe, dieser Artikel hat Ihnen geholfen zu verstehen, wie Sie Umgebungsvariablen in Ihren Java-Projekten verwenden können.

Nutzen Sie noch andere Möglichkeiten, mit Umgebungsvariablen zu arbeiten? Ich würde es gerne wissen!

Matthew Setter ist PHP-Editor im Twilio Voice-Team und ein Entwickler in verschiedenen Sprachen. Er ist auch der Autor von Mezzio Essentials und Docker Essentials. Wenn er nicht gerade PHP-Code schreibt, schreibt er großartige PHP-Artikel hier bei Twilio. Sie erreichen ihn unter msetter@twilio.com und finden ihn unter settermjd auf Twitter und GitHub.