Подтвердить что ты не робот

Какое место лучше всего хранить в файле конфигурации в веб-приложении Java (WAR)?

Я создаю веб-приложение (WAR) и развертываю его на Tomcat. В webapp есть страница с формой, в которой администратор может ввести некоторые данные конфигурации. Я не хочу хранить эти данные в СУБД, а только в файле XML в файловой системе. Где сказать?

Я хотел бы поместить файл где-нибудь в дерево каталогов, где развертывается само приложение. Должен ли мой файл конфигурации находиться в каталоге WEB-INF? Или положить его в другое место?

А какой код Java используется в сервлете, чтобы найти абсолютный путь к каталогу? Или можно получить доступ с относительным путем?

4b9b3361

Ответ 1

Мы делаем это, чтобы поместить его в отдельный каталог на сервере (вы можете использовать что-то вроде /config,/opt/config,/root/config,/home/username/config или что угодно). Когда наши сервлеты запускаются, они читают XML файл, извлекают из него несколько вещей (самое главное, информацию о соединении с DB) и что он.

Я спросил, почему мы это сделали однажды.

Было бы неплохо хранить все в БД, но, очевидно, вы не можете хранить информацию о подключении БД в БД.

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

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

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

Единственное другое решение, о котором я могу думать, что это будет хорошо работать, будет хранить все в БД, кроме информации входа в БД. Это произойдет из свойств Java-системы, которые извлекаются через JVM. Это API-интерфейс настроек, упомянутый Хансом Доггеном выше. Я не думаю, что это было вокруг, когда наше приложение было впервые разработано, если бы оно не использовалось.

Что касается пути доступа к файлу конфигурации, это просто файл в файловой системе. Вам не нужно беспокоиться о веб-пути. Поэтому, когда ваш сервлет запускается, он просто открывает файл в файле /config/myapp/config.xml(или что-то еще), и он найдет правильную вещь. Просто hardcodeing путь для этого кажется мне совершенно безвредным.

Ответ 2

WEB-INF - хорошее место для размещения вашего файла конфигурации. Здесь некоторый код, чтобы получить абсолютный путь каталога от сервлета.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")

Ответ 3

Вводя его в WEB-INF, скрыть файл XML от пользователей, которые пытаются получить к нему доступ напрямую через URL-адрес, да, я бы сказал, поставьте его в WEB-INF.

Ответ 4

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

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

Ответ 5

Ответ на этот вопрос зависит от того, как вы собираетесь читать и записывать этот файл конфигурации.

Например, структура Spring дает возможность использовать файлы конфигурации XML (или файлы свойств Java); они могут храниться в вашем пути к классам (например, в каталоге WEB-INF), где-либо еще в файловой системе или даже в памяти. Если вы хотите использовать Spring для этого, тогда самое легкое место для хранения файла конфигурации находится в вашем каталоге WEB-INF, а затем используйте Spring ClassPathXmlApplicationContext для доступа к вашему конфигурационному файлу.

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

Ответ 6

Если это ваша настраиваемая конфигурация, WEB-INF - это хорошее место для нее. Но некоторые библиотеки могут требовать, чтобы конфигурационные файлы находились в WEB-INF/classes.