Настройка Tomcat для использования файла свойств для загрузки информации о соединении DB

Каковы принятые методы создания развертывания Tomcat, который считывает параметры конфигурации из файла свойств?

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

Ответ 1

Мы часто распространяем webapps, предоставляя WAR и XML файл Context, который помещается в ваш каталог tomcat/conf/Catalina/localhost и может загружать webapp с любого пути. Существует справочный документ здесь. Это дает следующие преимущества:

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

Если вам действительно нужен файл свойств, вы можете установить параметр в файле XML-контекста, указывающем на ваш файл свойств, прочитать параметр в ServletContextListener, а затем прочитайте в файле свойств.

Ответ 2

Как мы справляемся с этим:

  • Попросите клиента создать пул подключений в GlobalNamingResources, используя имя ресурса, с которым мы соглашаемся. Драйвер базы данных должен находиться в пути Tomcat.
  • Наш файл войны содержит файлы META-INF/context.xml, в которых ResourceLink ссылается на пул соединений, настроенный на шаге 1.

Это немного больше, чем просто обработка информации о соединении context.xml напрямую, но со временем она должна окупиться. Сервер разработки будет устанавливать с ним GlobalNamingResources, указывающий на разработку, а тестовый сервер указывает на тестирование и т.д. Затем один и тот же файл WAR может быть скопирован на каждый сервер без редактирования.

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

Пример GlobalNamingResource:

<Resource name="jdbc/dbconnection" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1546:SID"
username="scott" password="tiger" maxActive="8" maxIdle="4"
validationQuery="select 1 from dual"
testOnBorrow="true"/>

Пример файла context.xml в военном файле:

<Context path="/MyWebApp" docBase="MyWebApp" debug="5" reloadable="true">
    <ResourceLink name="jdbc/dbconnection" global="jdbc/dbconnection" 
          type="javax.sql.DataSource"/>
</Context>

Ответ 3

Хорошая практика хранения конфигурации из зоны военных действий. В нашей WAR мы имеем местоположение по умолчанию для поиска файла свойств. Если по умолчанию не работает, вы можете указать местоположение через параметр JVM или параметр контекста, определенный в фрагменте контекста в каталоге conf/Catalina/[host]. Например,

<Context docBase="/server/app.war"
    swallowOutput="true" unpackWAR="false" useNaming="false">

    <Parameter name="config-file" value="/config/db.properties" override="true" />
</Context>