Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как прочитать переменную окружения со значением по умолчанию

Короткий ответ

System.getenv() возвращает null, если переменной нет, — подставьте значение по умолчанию через Objects.requireNonNullElse():

void main() {
    String mode = Objects.requireNonNullElse(System.getenv("APP_MODE"), "development");
    IO.println(mode);
}

Результат:

development

Когда переменная задана

Переменную задают перед запуском: в Linux и macOS — APP_MODE=production java Main.java, в PowerShell — $env:APP_MODE = "production", затем java Main.java:

void main() {
    String mode = Objects.requireNonNullElse(System.getenv("APP_MODE"), "development");
    IO.println(mode);
}

Результат:

production

Число из переменной

Переменные окружения всегда строки. Для числа удобно Optional:

void main() {
    int port = Optional.ofNullable(System.getenv("APP_PORT"))
        .map(Integer::parseInt)
        .orElse(8080);
    int workers = Optional.ofNullable(System.getenv("APP_WORKERS"))
        .map(Integer::parseInt)
        .orElse(4);
 
    IO.println(port);
    IO.println(workers);
}

Результат:

9090
4

Обязательная переменная

Если без значения работать нельзя, остановитесь сразу с понятным сообщением:

void main() {
    String url = System.getenv("DATABASE_URL");
    if (url == null || url.isBlank()) {
        throw new IllegalStateException("Environment variable DATABASE_URL is not set");
    }
    IO.println("Connecting to " + url);
}

Результат:

Exception in thread "main" java.lang.IllegalStateException: Environment variable DATABASE_URL is not set

Частая ошибка

Путать переменные окружения с системными свойствами. Значение, переданное как java -Dapp.mode=test Main.java, читается через System.getProperty(), а System.getenv() его не видит:

void main() {
    IO.println(System.getProperty("app.mode"));
    IO.println(System.getenv("app.mode"));
}

Результат:

test
null

Функции из этого ответа

  • System.getenv() — Возвращает значение переменной окружения или null, если такой переменной нет.
  • System.getProperty() — Возвращает системное свойство JVM: версию Java, имя ОС или своё свойство, заданное через -D.
  • Objects.requireNonNull() — Проверяет, что значение не null, и сразу бросает NullPointerException с понятным сообщением.
  • Optional.ofNullable() — Оборачивает значение, которое может быть `null`, в `Optional`.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.