Перейти к основному содержимому

Java System.getProperty против System.getenv

· 3 мин. чтения

1. Введение

Пакет java.lang автоматически импортируется в приложение Java. Этот пакет содержит множество часто используемых классов от NullPointerException до Object , Math и String .

Класс java.lang.System является окончательным классом, что означает, что мы не можем создать его подкласс, поэтому все методы являются статическими .

Мы рассмотрим различия между двумя методами System для чтения системных свойств и переменных среды.

Это методы getProperty и getenv .

2. Использование System.getProperty()

Платформа Java использует объект Properties для предоставления информации о локальной системе и конфигурации, и мы называем его System Properties .

Системные свойства включают такую информацию, как текущий пользователь, текущая версия среды выполнения Java и разделитель пути к файлу.

В приведенном ниже коде мы используем System.getProperty("log_dir") для чтения значения свойства log_dir . Мы также используем параметр значения по умолчанию, поэтому, если свойство не существует, getProperty возвращает / tmp /log :

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

Чтобы обновить системные свойства во время выполнения, используйте метод System.setProperty :

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

Мы можем передать наши собственные значения свойств или конфигураций в приложение, используя аргумент командной строки propertyName в формате:

java -jar jarName -DpropertyName=value

Установка свойства foo со значением bar в app.jar:

java -jar app -Dfoo="bar"

System.getProperty всегда будет возвращать String .

3. Использование System.getenv()

Переменные среды — это пары ключ/значение, такие как свойства. Многие операционные системы используют переменные среды, чтобы разрешить передачу информации о конфигурации в приложения.

Способ установки переменной среды отличается от одной операционной системы к другой. Например, в Windows мы используем приложение System Utility из панели управления, а в Unix мы используем сценарии оболочки.

При создании процесса он по умолчанию наследует среду клонирования своего родительского процесса.

В следующем фрагменте кода показано использование лямбда-выражения для печати всех переменных среды.

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

getenv() возвращает карту только для чтения . Попытка добавить значения на карту вызывает исключение UnsupportedOperationException .

Чтобы получить одну переменную, вызовите getenv с именем переменной:

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

С другой стороны, мы можем создать другой процесс из нашего приложения и добавить в его среду новые переменные.

Чтобы создать новый процесс в Java, мы используем класс ProcessBuilder , у которого есть метод с именем environment . Этот метод возвращает карту , но на этот раз карта не доступна только для чтения, то есть мы можем добавлять к ней элементы:

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

4. Различия

Хотя оба по сути являются картами, предоставляющими значения String для ключей String , давайте рассмотрим несколько отличий:

  1. Мы можем обновлять свойства во время выполнения, в то время как переменные среды являются неизменяемой копией переменных операционной системы.
  2. Свойства содержатся только на платформе Java, в то время как переменные среды являются глобальными на уровне операционной системы и доступны для всех приложений, работающих на одном компьютере.
  3. Свойства должны существовать при упаковке приложения, но мы можем создавать переменные среды в операционной системе практически в любой момент.

5. Вывод

Несмотря на концептуальное сходство, применение как свойств, так и переменных среды совершенно различно.

Выбор между вариантами часто является вопросом масштаба. Используя переменные среды, одно и то же приложение можно развернуть на нескольких компьютерах для запуска разных экземпляров и настроить на уровне операционной системы или даже в консолях AWS или Azure. Устранение необходимости перестраивать приложение для обновления конфигурации.

Всегда помните, что getProperty следует соглашению о верблюжьем регистре, а getenv — нет.