2013-06-14 2 views
3

Многие советы в Интернете по хранению переменных, которые могут меняться в зависимости от условий env/other, - это помещать их в web.xml, но не является ли web.xml в военном файле? даже если вы найдете взорванную войну и измените ее, разве это не получится, если вы обновите военный файл? Или webcontainer предоставляет любой способ настройки web.xml без использования военного файла?Цель хранения переменных в web.xml?

+2

Ирония конфигурации предприятия: создайте сложную структуру для конфигурации, которая читается из XML-файла, потому что «она не должна быть жестко запрограммирована, так как, возможно, вы хотите ее изменить, не перестраивая все это», то вы ее специфицируете так, чтобы вы должны сделать новый артефакт, когда вам нужно перенастроить что-то. Лолз. – gustafc

+0

@gustafc точно, нам кажется, что нам нужен всего один слой абстракции – Rnet

ответ

3

Переменные web.xml имеют очень ограниченное применение, по моему опыту - единственное преимущество в том, что это стандартное место для поиска жестко запрограммированной «конфигурации».

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

  • Использование свойств системы (которая обычно включает в себя возиться со сценариями запуска, и это может быть трудно чтобы получить хороший обзор всей вашей конфигурации)
  • Использовать переменные среды (те же недостатки, что и свойства системы)
  • Прочитать конфигурационный файл из предопределенного местоположения; часто из пути к классам, используя getResourceAsStream (IIRC, что обычно означает, что ввод конфигурационных файлов в lib каталоге Tomcat в)

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

Это может иметь отношение к вашим интересам: How can I store Java EE configuration parameters outside of an EAR or WAR?

+0

Использование JNDI для поиска постоянного файла имеет смысл. Googling tomcat + jndi config показывает результаты, которые устанавливают jndi config внутри web.xml env-entry или META-INF/context.xml, я знаю, что это не единственный способ сделать это, но все же, The lolz. – Rnet

0

Преимущества определения значений параметров в web.xml

  • Использование файла собственных настроек требует дополнительного кодирования и управления.
  • Значения параметров жесткого кодирования непосредственно в коде приложения затрудняют их изменение в будущем и сложнее использовать разные настройки для разных развертываний (например, параметры JDBC, адрес почтового сервера).
  • Другие разработчики, использующие ваш код, смогут легче находить любые соответствующие параметры, поскольку это стандартное расположение для таких параметров, которые будут установлены.

Смотрите также:

+0

Все точки могут быть применены к файлу xyzConstants.java, который просто объявляет все константы как статические строки и т. Д., Как объявление в web.xml лучше, чем константы файл? – Rnet

+0

@Rnet Вы можете наследовать и переопределять их. –

0

Насколько я знаю, web.xml не предоставляет возможности хранения пользовательских переменных. Типичным способом настройки вашего веб-приложения является сохранение конфигурации в базе данных, отдельные свойства/xml/json/другой файл, получение конфигурации из отдельной веб-службы или предоставление ее через переменные среды.

Часто используется смесь всех этих веществ. Например, при запуске вашего контейнера вы можете добавить системную переменную, используя переключатель -D. Эта переменная будет содержать путь к файлу или URL-адресу, где может быть найдена ваша конфигурация.

Вы можете указать параметры, используя среду ОС.

Вы должны зависеть от того, сколько параметров у вас есть, какое приложение вы разрабатываете и как настроить сервер приложений или компьютерную ОС. Например, если вы используете хостинг-приложение на сервере, вы не можете настроить эти способы, это не для вас, поэтому ваши DB или веб-службы являются вашими единственными способами.

+0

Да, возможно, я не смогу получить доступ к переменным OS env при производстве, даже если бы это было так, его можно легко изменить любым другим приложением, скриптом и т. Д. DB/web-сервис - это роскошь, которой могут не обладать небольшие приложения. Системная переменная -D может работать, но не кажется чистой, она чувствует себя как принуждение к чему-то на всей инициативе запуска сервера вашего webapp, если на одном сервере есть много веб-приложений, и каждый из них указывает на множество переменных, которые быстро становятся беспорядочными. – Rnet

0

Люди, которые работают на контейнере Tomcat распознать иронию, что вы определили и реализован способ работы вокруг этого вопроса.

Решение, которое они внедрили для проблем, о которых вы упоминали, заключается в создании еще одного файла xml ... the context.xml file, который считывается сервером.

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

Я не использую Tomcat, так что я мог бы быть неправильно интерпретировать документы

Веб-контейнер GlassFish поддерживает аналогичную функцию, но делает это с помощью команды пара администратора (CLI asadmin):

Возможно, есть поддержка консоли веб-администратора, и вы можете настроить их, отредактировав файл domain.xml. Похоже, что он не такой гибкий, как реализация Tomcat ... но он делает его очень простым в использовании.

Необходимо, чтобы disable, а затем enable ваша заявка на изменение значений до «взятия». Не передислоцируйте приложение, поскольку оно удалит значение, которое вы только что установили.

Смежные вопросы