Решение простое: не помещайте конфигурацию в ваш context.xml.
Вот решение, которое мы используем (которое хорошо работает для ряда внешних клиентов):
У нас есть одна война, которая будет использоваться в разных средах, webapp.war. У нас есть три среды: разработка, интеграция и производство. Интеграция и производство на месте заказчика. Мы не знаем пароли и пути к файлам для клиентских сайтов интеграции и производства.
Мы используем комбинацию двух вещей: поиск JNDI для базы данных и файлы внешних свойств.
В context.xml
, поставляемом на войне, у нас есть ResourceLink
<ResourceLink name="jdbc/webapp"
global="uk.co.farwell.webapp.datasource.MySqlDataSource" />
Это дает ссылку на глобально определенный источник данных, который определен в server.xml
для Tomcat.
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
name="uk.co.farwell.webapp.datasource.MySqlDataSource"
password="xxx" url="xxx" username="fff" />
Таким образом, детали базы данных могут быть изменены путем редактирования server.xml
без изменения webapp.war
. Важно, что это нужно сделать только один раз для каждого сервера, а не при повторном развертывании.
В нашей конфигурации пружины, чтобы определить dataSource
, мы имеем:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/webapp" />
Для других свойств у нас есть глобальный файл application.properties, который поставляется вместе с webapp.war, но не является частью войны. На это указывает -D
в командной строке для запуска Tomcat. -Duk.co.farwell.webapp.applicationDir="/usr/xxx/fff"
. Мы подбираем определение и читаем файл свойств. Вещи в базе данных также могут быть выполнены таким образом, но мы потеряем пул, созданный Tomcat.
Другое дело: нам не нужно перестраивать, если серверы перемещены или если по какой-то причине меняются машины. Это вопрос клиента и его сотрудников инфраструктуры.