Подтвердить что ты не робот

Почему tomcat заменяет context.xml на повторное развертывание?

Документация говорит, что здесь есть файл контекста:

$CATALINA_HOME/conf/Catalina/localhost/myapp.xml

он НЕ будет заменен на файл контекста:

mywebapp.war/META-INF/context.xml

Здесь написано: http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

Только если файл контекста не существует для приложения в $CATALINA_BASE/conf/[enginename]/[имя_хоста]/в отдельном файле в файле /META -INF/context.xml внутри файлов приложения.

Но каждый раз, когда я повторно развертываю войну, он заменяет этот файл myapp.xml/META-INF/context.xml!

Почему он это делает и как я могу его избежать?

Thanx

4b9b3361

Ответ 1

При отмене развертывания часть повторного развертывания удаляет приложение и связанный с ним context.xml.

Если вы используете плагин maven tomcat, вы можете избежать удаления context.xml, если развернете свое приложение с помощью команды, подобной этой:

mvn tomcat:deploy-only -Dmaven.tomcat.update=true

Подробнее здесь: https://tomcat.apache.org/maven-plugin-2.0-beta-1/tomcat7-maven-plugin/deploy-only-mojo.html

Вы также можете использовать deploy-only с параметром mode для развертывания context.xml.

Ответ 2

Короткий ответ:

Просто создайте директорию TOMCATHOME/conf/Catalina/localhost только для чтения и продолжайте читать для получения дополнительной информации:

  • Для режима быстрого развертывания (динамический веб-проект Eclipse, прямой Tomcat соединение и т.д.) на локальном/не общего сервера Tomcat вы можете просто определить свой источник данных JDBC (или любой другой другой "веб-ресурс" ) с использованием файла META-INF/context.xml внутри WAR. Легко и быстро в вашей локальной среде, но не подходит для постановки, контроля качества или производство.
  • Для режима построения развертывания (обычно для этапа, QA или prod) JDBC источники данных и другие данные "веб-ресурсов" определяются QA/производственная группа, а не команда разработчиков. Поэтому они должен быть указан на сервере Tomcat, а не внутри файла WAR больше. В этом случае укажите их в файле TOMCATHOME/conf/Catalina/localhost/CONTEXT.xml (изменить Каталина движком и localhost для хоста, а CONTEXT соответствующим контекстом). Однако, Tomcat удалит этот файл для каждого развертывания. Чтобы предотвратить это удаление, просто сделайте эту директорию только для чтения; в Linux вы можете ввести:

       chmod a-w TOMCATHOME/conf/Catalina/localhost
    

    Voila! Ваше приветствие.

Длинный ответ

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

Ответ 3

В tomcat7, также autoDeploy = false, файл будет удален при распаковке. Это документировано, а не ошибка (хотя он избегает хороших автоматизированных развертываний с фиксированной конфигурацией на стороне сервера).

Я нашел обходное решение, которое решило проблему для меня:

  • создайте файл META-INF/context.xml в вашем webapp, который содержит
  • на сервере создайте второй контекст "/config-context" в файле server.xml и разместите там все параметры конфигурации на стороне сервера.
  • в приложении используйте context.getContext( "/config-context" ). getInitParameter (...) для доступа к конфигурации там.

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

Также должно быть возможно добавить конфигурации для каждого контекста, добавив такие контексты, как "/config-context-MYPATH". В вашем приложении вы можете использовать контекстный путь приложения, чтобы вычислить путь к контексту конфигурационного приложения.

Ответ 4

В соответствии с документацией (http://tomcat.apache.org/tomcat-8.0-doc/config/automatic-deployment.html#Deleted_files) при повторном развертывании tomcat обнаруживает удаление (undeploy) вашего приложения. Таким образом, он начнет процесс очистки, удалив также каталог и xml. Это не зависит от автоматического развертывания - так это произойдет при перераспределении через менеджера и изменении войны. Есть 3 исключения:

  • глобальные ресурсы никогда не удаляются.
  • внешние ресурсы никогда не удаляются.
  • если WAR или DIR были изменены, тогда файл XML удаляется если copyXML истинно и deployXML истинно

Я не знаю почему, но copyXML = "false" deployXML = "false" не поможет.

Во-вторых: создание каталога только для чтения только делает tomcat бросать исключение и не запускаться.

Вы можете попробовать объединить файлы $CATALINA_BASE/conf/Catalina/localhost/myapp-1.xml, $CATALINA_BASE/conf/Catalina/localhost/myapp-2.xml и т.д. в $CATALINA_BASE/conf/context.xml( это работает, только если вы убедитесь, что ваше приложение не будет развертывать собственную конфигурацию контекста, например myapp-1.xml)

Если кто-то может сказать, что такое "внешние ресурсы", которые обычно решают проблему.

Ответ 5

Общая проблема, описанная в заголовке, описана в Повторном развертывании с войны без удаления контекста, которая в настоящее время остается открытой.

Существует признанное различие между повторным развертыванием, которое не удаляет контекст, и развертыванием после развертывания, когда развертывание удаляет контекст. Документация устарела, и графический интерфейс менеджера по-прежнему не поддерживает повторное развертывание.

Ответ 6

Передислокация означает две части: отмена развертывания и развертывание.

При развертывании удаляется conf/Catalina/yourhost/yourapp.xml, потому что

 <Host name="localhost" appBase="webapps" unpackWARs="true" 

           autoDeploy="true">      <!-- means autoUndeploy too!!! -->

 </Host>

Измените autoDeploy="false", и у Tomcat больше нет приказа удалить conf/Catalina/yourhost/yourapp.xml.

Существует функция, которая позволяет нам выполнять эти шаги (отменять/развертывать) как один единственный шаг (повторное развертывание), которые не удаляют context.xml. Эта функция доступна через текстовый интерфейс manager, но опция недоступна при использовании html-интерфейса manager. Возможно, вам придется подождать, пока ошибка в tomcat не будет исправлена. Вы можете использовать метод, описанный в этом ответе, в качестве обходного пути.