Рубрики
Без рубрики

Java System.getProperty vs System.getenv

Узнайте, как именно использовать getProperty и getenv с java.lang.Система.

Автор оригинала: baeldung.

1. введение

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

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

Мы рассмотрим различия между двумя методами 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 method:

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

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

java -jar jarName -DpropertyName=value

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

java -jar app -Dfoo="bar"

Установка свойства foo со значением bar в app.jar: всегда будет возвращать Строка .

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

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

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

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

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

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

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

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

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

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

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

ProcessBuilder pb = new ProcessBuilder(args);
Map 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 – нет.