Правильно ли для свойств системы Java использоваться для установки и получения произвольных параметров программы?

Можно использовать аргументы -Dproperty=value для установки произвольных системных свойств (а не некоторого фиксированного набора системных свойств, фактически используемых JVM), и программа может получить эти свойства позже, используя System.getProperty("property"). Правильно ли это делать?

Я не нашел авторитетного ответа на это, поэтому я спрашиваю здесь. Мне кажется, что параметры программы должны быть заданы с помощью аргументов командной строки для программы, а не для JVM. Однако, возможно, это общепринятая практика, которая просто не документирована нигде, где я смотрел до сих пор. Я бы хотел быть уверен. Спасибо.

Ответ 1

Я думаю, что свойства системы Java используются для передачи значений из командной строки в библиотеки или плагины внутри выполнения. Это, что инсайдерский компонент не имеет прямого способа получить параметр из основной программы, которая его выполняет. Поэтому он читает его из "контекста", что свойства системы Java.

Если мы рассмотрим это как слои, аргументы командной строки будут параметрами для промежуточного нижнего уровня, а системные java-свойства являются контекстом для всех нижних слоев.

command line: arguments + properties
   main program: uses arguments
      some library/plugin: uses properties from context

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

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

Ответ 2

По-моему, это не "неправильно", и есть программы и библиотеки, которые используют свои собственные системные свойства для конфигурации.

Однако, вероятно, более практично ставить параметры конфигурации для вашего программного обеспечения в файле конфигурации (в любом формате, который, по вашему мнению, подходит) - файл .properties, XML файл или что-то еще). Это громоздко, особенно если у вас много параметров конфигурации, нужно поместить все эти параметры в командной строке с параметрами -Dname=value.

Ответ 3

Этот метод можно использовать для установки некоторых параметров вашего приложения. Я считаю настройки в отличие от аргументов программы. Например. Позвольте думать о некоторых файлов конвертер. Он преобразует файл A в B. Таким образом, файлы A и B должны быть параметрами командной строки. Если вашему конвертеру нужна некоторая временная папка, вы можете установить id на -Dmy.package.tempfolder=\my\tmp\folder. Но для этого должна быть настройка по умолчанию, и программа должна работать без этой настройки.

Подумайте об этом как альтернативе файлу .properties. Файл .properties будет более удобным, конечно.

Ответ 4

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

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

Ответ 5

Из http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html:

Например, следующий вызов getProperty просматривает Системное свойство называется subliminal.message. Это не действительная система свойство, поэтому вместо возврата null этот метод возвращает значение по умолчанию, предоставленное в качестве второго аргумента: "Buy StayPuft Зефир!"

System.getProperty("subliminal.message", "Buy StayPuft Marshmallows!");

Это означает, что свойства, отличные от тех, которые используются JVM, являются "недопустимыми". Однако позже в том же документе он приводит пример загрузки файла свойств, содержащего тот же параметр свойства.

subliminal.message = Купить зефиры StayPuft!

Он только советует "В общем, будьте осторожны, чтобы не перезаписывать свойства системы".

Итак, похоже, что это поддерживаемое использование свойств системы. Это похоже на случай ввода в заблуждение. Когда я слышу "Свойства системы", я думаю, что "свойства JVM", где JVM - это система. Хотя свойства используются для этого, они также могут использоваться для настроек приложения. Я думаю, что сделаю мысленное замечание, чтобы подумать об этом как "Свойства системы и приложения".

Кто-нибудь не согласен с этим?