Назад | Перейти на главную страницу

Развертывание Tomcat перезаписывает context.xml

Я новичок в 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);