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 - нет.