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

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

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

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

Ответы [ 6 ]

48 голосов
/ 19 сентября 2008

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

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

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

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

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

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

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

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

16 голосов
/ 19 сентября 2008

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

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
9 голосов
/ 19 сентября 2008

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

5 голосов
/ 18 сентября 2008

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

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

3 голосов
/ 18 сентября 2008

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

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

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

1 голос
/ 18 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...