Я новичок в Tomcat в целом, поэтому, пожалуйста, укажите, если что-то не так.
Мой вопрос касается обновлений для уже развернутых приложений с помощью диспетчера Tomcat. Но обо всем по порядку. Я использую файл META-INF / Context.xml для хранения информации о подключении к базе данных, поэтому он уникален для каждого сервера, на котором развернуто приложение. Я не уверен, что это оптимально, но это единственный способ, который я знаю.
Итак, при обновлении приложения важно, чтобы этот файл не изменялся, потому что я не хочу, чтобы мне приходилось переделывать все изменения каждый раз, когда я обновляю свое приложение.
Для обновления я использую Tomcat Manager, и я пробовал разные подходы, но, похоже, все основано на процессе отмены развертывания, а затем развертывания новой версии. Таким образом, Context.xml удаляется / заменяется пустым файлом Context.xml.
Итак, мой вопрос в основном заключается в том, как мне обновить работающее веб-приложение и в то же время оставить Context.xml нетронутым?
Кстати, я использую Tomcat 6.0.24.
Настройка, с которой я сейчас работаю, имеет несколько контекстов, в которых работает одно и то же веб-приложение, и каждый контекст имеет разные настройки базы данных (аналогично вашей настройке, за исключением того, что каждый контекст работает на другом сервере).
Вместо включения файла context.xml в META-INF вы можете создать context.xml специально для каждого экземпляра на каждом сервере и поместить его в $ TOMCAT_ROOT $ / conf / Catalina / localhost. Когда Tomcat запускает контекст, любые настройки в Catalina / localhost / context.xml переопределяют те, которые установлены в вашем веб-приложении (либо через файл WEB-INF / web.xml, либо через файл META-INF / context.xml).
У нас были небольшие проблемы с этим, однако параметры, определенные в Catalina / localhost / context.xml, неправильно переопределяют параметры, определенные в веб-приложении, но это легко решается путем добавления атрибута override к узлу Parameter следующим образом:
<Parameter name="foo" value="bar" override="1"/>
Документы для контексты кота описывает многое из этого более подробно.
Мой подход:
// In debug there are no context
// In production is de WAR / Context name
String database = servletContext.getContextPath();
database = database.replace("/", "");
if (database.isEmpty())
database = "<my_default_context_name_only_debug>";
getLogger().info("Database: " + database);
dataSource = (DataSource) dataSourceCtx.lookup("jdbc/" + database);