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
, давайте рассмотрим несколько отличий:
- Мы можем обновлять свойства во время выполнения, в то время как переменные среды являются неизменяемой копией переменных операционной системы.
- Свойства содержатся только на платформе Java, в то время как переменные среды являются глобальными на уровне операционной системы и доступны для всех приложений, работающих на одном компьютере.
- Свойства должны существовать при упаковке приложения, но мы можем создавать переменные среды в операционной системе практически в любой момент.
5. Вывод
Несмотря на концептуальное сходство, применение как свойств, так и переменных среды совершенно различно.
Выбор между вариантами часто является вопросом масштаба. Используя переменные среды, одно и то же приложение можно развернуть на нескольких компьютерах для запуска разных экземпляров и настроить на уровне операционной системы или даже в консолях AWS или Azure. Устранение необходимости перестраивать приложение для обновления конфигурации.
Всегда помните, что getProperty
следует соглашению о верблюжьем регистре, а getenv
— нет.