Является ли плохой практикой включать файлы свойств / конфигурации в jars?

StackOverflow https://stackoverflow.com/questions/1208848

Вопрос

Например:

MyApp - это веб-приложение, содержащее файл свойств (server.properties), который описывает конфигурационные данные (напримеримена серверов) для приложения.На этапе разработки server.properties находится в собственной папке проекта IDE (логичное место для него).

Теперь пришло время развернуть MyApp.IDE делает довольно тривиальным создание файлов классов, а также вспомогательных конфигурационных файлов.Теперь мы просто опускаем Банку в соответствующий веб-контейнер и отправляемся в путь....

Неделю спустя...данные конфигурации сервера, которые использует MyApp, необходимо изменить.Что имеет больше смысла?

A.Измените файл server.properties обратно в среде IDE и сгенерируйте совершенно новый jar-файл.Передислоцировать.(что означает перезапуск приложения для простого изменения конфигурации).

B.Взломайте уже развернутый Jar и измените файл server.properties?(возможно, придется вызвать функцию обновления в MyApp, если server.properties кэширован...но не должно требовать полного отказа приложения.Также не забудьте также изменить исходный server.properties, чтобы при будущих развертываниях server.properties не возвращался к старым именам серверов).

C.В первую очередь сделайте server.properties внешним по отношению к файлу jar.Очень похоже на процесс B, с небольшим отличием в сохранении конфигурационных данных внешними по отношению к jar (вводятся разные пути между развертыванием разработки и производства)

D.Другое:

Спасибо!

Это было полезно?

Решение

Я бы пошел с Д.

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

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

Другие советы

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

<!-- try and resolve the config from the filesystem first and then fallback to the classpath -->
<context:property-placeholder location="file:config.properties, classpath:config.properties"
                              ignore-resource-not-found="true"/>

Вы можете указать ресурс в файловой системе, а также в пути к классу, Spring сначала попытается разрешить все свойства из файловой системы, а затем вернется к пути к классу.Указав атрибут "игнорировать-ресурс-не-найден" как "true", это предотвратит выдачу Spring исключения, если файл отсутствует в файловой системе, и позволит ему вместо этого разрешить свойства из classpath .

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

В папке, содержащей:

application.jar
config.properties

Вы должны уметь использовать:

java -jar application.jar

Это пример конфигурации.properties для справки:

# This file contains properties that are used to configure the application
database.url=127.0.0.1
database.port=3306
database.user=root
database.pass=p4ssw0rd

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

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

D.

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

Помните, что в J2EE вы НЕ гарантированно сможете получить доступ к файлам извне среды J2EE (нет прямого доступа к файлам).

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

Websphere, например, по умолчанию не разрешает прямой доступ к файлам.

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

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

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

Часто это критерий, по которому код должен быть перенесен НЕИЗМЕННЫЙ от тестирования до производства.Это означает, что вы не имеете права редактировать встроенные конфигурационные файлы.Также вы можете оказаться в ситуации, когда вам потребуется изменить развернутую конфигурацию, что часто бывает очень громоздким.Следовательно, мы оставляем конфигурацию за пределами jars.

Для приложений Java EE рассмотрите JNDI или файл свойств в classpath.

У меня есть веб-приложение, в котором конфигурация восстанавливается из соседнего веб-приложения просто для того, чтобы разделить их.Это оказалось намного проще.

Я использую файлы свойств в webapps (WARs), но в основном для значений по умолчанию и прочего, что более или менее неизменяемо (поскольку webapps не должны обновлять свои WARs, даже когда могут).

Однако для вещей, подобных тому, о чем вы говорите, я использую JNDI.Вы можете определить свойства как ресурсы в вашем файле web.xml.Таким образом, в худшем случае вы обновляете web.xml, а не само приложение.

Для некоторых серверов существуют способы переопределить эти значения ресурсов, вообще не затрагивая WAR.Например, в Tomcat.

Обычно я провожу одну войну для тестирования, вопросов и ответов и производства и переопределяю чувствительные к среде ресурсы именно в этом was, используя контекстные XML-файлы Tomcat.Я считаю, что это намного лучше, чем создавать несколько WARs или модифицировать WARS, поскольку приложение, которое я тестирую, почти идентично приложению, находящемуся в производстве.

Я думаю, ответ зависит от того, считаете ли вы, что вам нужен контроль версий для конфигураций.(Это могут быть производственные конфигурации или конфигурации для регрессионного тестирования ...)

  • Если вам не нужен контроль версий, то подойдет вариант D с внешним файлом свойств, который переопределяет файл свойств.Варианты B и C более открыты для дополнений, но если бы вы действительно заботились о них, вы бы использовали контроль версий :-)
  • Если вам нужен контроль версий, опция A дает вам больше контроля, но если у вас есть возможность нескольких развертываний, вы также можете захотеть контролировать версии конфигураций для каждого развертывания.Примером может служить раздельное развертывание на тестовой и производственной платформах.

Вот как мы делаем это, используя Maven modules и Maven WAR file "наложения".

  1. У нас есть несколько модулей для компонентов Java-кода.Это модули JAR.
  2. У нас есть модуль "base webapp" для статического содержимого, JSP и данных конфигурации ядра (Spring wiring, свойства по умолчанию).Это модуль WAR, поэтому результатом сборки является WAR, который содержит вышеуказанные + все JAR-файлы.
  3. Каждая отдельная "конфигурация сайта" представляет собой модуль WAR, который содержит специфические для сайта переопределения свойств, файлов подключения и содержимого.Переопределение описывается с использованием механизма "наложения" Maven WAR и приводит к тому, что новая война собирается из "базовой" войны и переопределений.

Все это проверяется в системе управления версиями, и вам нужно выполнить сборку Maven и развертывание WAR, чтобы внести изменения в конфигурацию.

Я уже задавал похожий вопрос.Мы еще не во всем разобрались.Но мы изучаем URL-адреса Ресурсов.Где файл свойств считывается непосредственно из SVN.Нет необходимости обновлять что-либо, кроме файла свойств.

Я разрабатываю приложения J2EE с использованием Spring.Я довольно долго размышлял над одной и той же проблемой, а затем нашел решение.Моя проблема заключалась в том, чтобы указать свойства базы данных в файле свойств вне файла war, который я развертываю.Решение, которое я нашел для этого, состоит в том, чтобы использовать PropertyPlaceholderConfigurer и указать свойство location для определения местоположения вашей системы следующим образом,

Это было довольно просто , и сработало просто отлично !

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top