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); Mapenv = pb.environment(); env.put("log_dir", "/tmp/log"); Process process = pb.start();
4. Различия
Хотя оба они по сути являются картами, которые предоставляют String значения для String ключей, давайте рассмотрим несколько различий:
- Мы можем обновлять свойства во время выполнения, в то время как переменные среды являются неизменяемой копией переменных Операционной системы.
- Свойства содержатся только в платформе Java, в то время как переменные среды являются глобальными на уровне операционной системы – доступными для всех приложений, работающих на одной машине.
- Свойства должны существовать при упаковке приложения, но мы можем создавать переменные среды в операционной системе практически в любой точке.
5. Заключение
Хотя концептуально они схожи, применение как Свойств, так и Переменных среды весьма различно.
Выбор между этими вариантами часто зависит от сферы охвата. Используя переменные среды, одно и то же приложение может быть развернуто на нескольких компьютерах для запуска различных экземпляров и может быть настроено на уровне операционной системы или даже в консолях AWS или Azure. Удаление необходимости перестроить приложение для обновления конфигурации.
Всегда помните, что getProperty следует соглашению о регистре верблюдов, а getenv – нет.