Как прочитать переменную окружения со значением по умолчанию
Короткий ответ
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`.