Как обновить веб-приложение Tomcat без перезапуска всей службы?

93

Я новичок в Tomcat. У нас есть машина разработчика, на которой запущено около 5 приложений. Несмотря на то, что это разработчик, наши клиенты довольно активно используют его во время тестирования.

Скажем, нам нужно внести одно небольшое изменение в один файл класса. Прямо сейчас нам нужно выключить Tomcat (что влияет на остальные четыре приложения), удалить WARфайл (и каталог веб-приложения), WARповторно развернуть новый файл и перезапустить Tomcat.

Конечно, это расстраивает некоторых людей, потому что уничтожает все сеансы, в которые вошли все приложения.

Есть лучший способ сделать это? Я имею в виду, есть ли способ перезагрузить только КЛАСС, который изменился, а не все на машине разработчика?

Спасибо.

cbmeeks
источник
Измените управление сеансом на то, что сохраняется в файле? Извините не удержался :)
rogerdpack
1
@rogerdpack Я многое узнал о Tomcat с тех пор, как задал этот вопрос более шести лет назад. Но все равно спасибо.
cbmeeks
Что касается горячей замены только классов см stackoverflow.com/questions/32459047/...
rogerdpack

Ответы:

59

Вы пробовали использовать приложение Tomcat Manager ? Он позволяет вам отменять развертывание / развертывание файлов войны без выключения Tomcat.

Если вы не хотите использовать приложение Manager, вы также можете удалить файл war из каталога webapps, Tomcat удалит приложение через короткий промежуток времени. Затем вы можете скопировать военный файл обратно в каталог, и Tomcat развернет военный файл.

Если вы используете Tomcat в Windows, вам может потребоваться настроить контекст, чтобы не блокировать различные файлы.

Если у вас абсолютно не может быть простоя, вы можете посмотреть на Tomcat 7. Параллельные развертывания. Вы можете развернуть несколько версий веб-приложения с одним и тем же контекстным путем одновременно. Правила, используемые для сопоставления запросов с версией контекста, следующие:

  • Если в запросе нет информации о сеансе, используйте последнюю версию.
  • Если информация о сеансе присутствует в запросе, проверьте диспетчер сеансов каждой версии на наличие подходящего сеанса и, если он найден, используйте эту версию.
  • Если информация о сеансе присутствует в запросе, но соответствующий сеанс не найден, используйте последнюю версию.
Стив К
источник
Это тоже хорошее предложение. До сегодняшнего дня я не слышал о приложении-менеджере. Да, мы используем Windows. Одна проблема, которую я испытываю при удалении файла WAR и ожидании, заключается в том, что наши клиенты часто ожидают "мелких исправлений". Подойдут ли эти предложения для этого сценария?
cbmeeks 05
1
@cbmeeks - это зависит от того, как часто происходят эти мелкие исправления и как скоро кто-то заметит. В любом случае приложение будет недоступно некоторое время. Это зависит от вашего оборудования / приложения, как долго это время. Но это измеряется секундами, я бы сказал, что обычно 5-10 в наших приложениях. Но ваш пробег может отличаться :)
Стив К.
1
Вау. Я так много узнал с тех пор, как задал этот вопрос. Да, теперь мы развертываем приложения Tomcat, не останавливая его полностью. Одна вещь, которую я сделал, - это убедиться, что все журналы (приложение и Tomcat) не записывают журналы ВНУТРИ папки webapps / application. Или также работает настройка Tomcat на отключение блокировки. Поэтому мы помещаем ведение журнала в центральное место за пределами папки Tomcat. Работает как мечта. Но ваш ответ был самым полезным. Благодарность!
cbmeeks
5
При повторном развертывании без перезапуска вам следует быть осторожным с утечками памяти - очень часто загрузчики классов будут пропускать ссылки, и вам нужно перезапустить весь процесс Tomcat, чтобы освободить память из старой версии приложения. LiveRebel (упомянутый в другом ответе) может автоматизировать все это за вас.
Neeme Praks
3
Вам не нужно удалять войну для повторного развертывания. Просто скопируйте старую войну и подождите несколько секунд.
peceps
31

Есть несколько простых способов.

  1. Просто коснитесь web.xml любого веб-приложения.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

Вы также можете обновить определенный файл jar в WEB-INF / lib, а затем коснуться web.xml, вместо того, чтобы создавать весь файл войны и развертывать его снова.

  1. Удалите каталог webapps / YOUR_WEB_APP, Tomcat начнет развертывание войны в течение 5 секунд (при условии, что ваш файл войны все еще существует в папке webapps).

  2. Обычно перезапись военного файла новой версией автоматически выполняется повторно с помощью tomcat. Если нет, вы можете коснуться web.xml, как описано выше.

  3. Скопируйте уже развернутый "каталог" в папку веб-приложений.

Чираг Катудиа
источник
1
Полезно знать, что метод touch не перезагружает классы. IOW, он не очищает и не перезагружает иерархию загрузчика классов для веб-приложения
Рондо,
2
О том, почему это работает, можно прочитать $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml отслеживается на предмет изменений. Другие ресурсы могут быть легко перечислены там по мере необходимости.
Кевин
21

В каталоге conf apache tomcat вы можете найти файл context.xml. В этом теге редактирования как < Context reloadable = "true" >. это должно решить проблему, и вам не нужно перезапускать сервер

скаль
источник
Вместо этого предпочтите приложение-менеджер. Это дорогостоящая операция для тарана.
Sorter