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

1. Введение

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

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

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

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

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

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

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

System.getenv().forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
  • getenv () возвращает доступную только для чтения Map . ** При попытке добавить значения на карту выдается исключение UnsupportedOperationException .

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

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

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

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

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

4. Отличия

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

, Мы можем обновлять свойства во время выполнения, пока переменные среды

неизменяемая копия переменных операционной системы.

, Свойства содержатся только в платформе Java, а среда

Переменные являются глобальными на уровне операционной системы - доступны для всех приложений, работающих на одном компьютере.

, Свойства должны существовать при упаковке приложения, но мы можем создать

Переменные среды в операционной системе практически в любой точке.

5. Вывод

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

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

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