Когда использовать переменные среды и свойства системы?

интересно, какой из следующих подходов является предпочтительным?

мы можем настроить вещи как APP_HOME=/path/to/file (export на .profile или что-то в этом роде) и получить к нему доступ как System.getenv("APP_HOME")

или, альтернативно используя свойства как -DAPP_HOME=/path/to/file и получить доступ к нему как System.getProperty("APP_HOME")

сейчас .. либо один из них сделает значение доступным для точки стойки приложения, но является ли предпочтительным любой подход? Почему? Когда?

4 ответов


Если вы используете Java 1.3 или 1.4 (и 1.2, IIRC), вы должны использовать системные свойства, так как . Он был восстановлен в Java 1.5. Соответствующий отчет об ошибке можно найти здесь.

вы можете использовать оба. Найдите свойства системы для ключа, и если его там нет, выполните поиск в среде. Это дает вам лучшее из обоих миров.

Это действительно не одно и то же: один требует, чтобы значение было задано явно, а другой нет. Кроме того, обратите внимание, что среда является удобным местом для размещения некоторых строк для взаимодействия.


Javadoc для System.getenv(String) адресуй этот вопрос напрямую, слова:

свойства и переменные среды оба концептуально сопоставления между именами и значениями. Оба механизмы могут использоваться для передачи пользовательской информации Java-процесс. Переменные среды оказывают более глобальное воздействие, потому что они видны всем потомкам процесса что определяет их, а не только непосредственный подпроцесс Java. Они могут иметь тонко различную семантику, такую как case нечувствительность, на различных операционных системах. Для них причины, переменные среды с большей вероятностью будут иметь побочные эффекты. лучше всего использовать системные свойства там, где это возможно. переменные среды должны использоваться, когда глобальный эффект желателен, или когда интерфейс внешней системы требуется переменная среды (например, PATH).

(выделено мной).


пока не могу комментировать, поэтому добавлю пару пунктов в качестве ответа.

Я согласен с высказыванием javadoc: "лучше всего использовать системные свойства, где это возможно.", также, по моим собственным словам, до того, как увидеть эту страницу здесь, системные переменные Java инкапсулированы внутри JVM. Они не видны другим процессам на хосте и, следовательно, менее связаны с хост-системой.

кроме того, существует несколько интерфейсов для установки глобального переменные среды, и поэтому может быть немного сложно отслеживать все значения, используемые с течением времени.


одно важное различие между использованием переменных среды (envs) и системных свойств, которые следует учитывать, заключается в том, что envs не могут быть изменены во время выполнения/в запущенном процессе, но системные свойства могут быть. Обратитесь к Javadoc:

https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setProperties-java.util.Properties-