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

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

Вопрос

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

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

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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