Як оновити веб-програму Tomcat без перезапуску всієї служби?


93

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

Отже, скажімо, нам потрібно внести одну невелику зміну в один файл класу. Зараз нам потрібно вимкнути Tomcat (що впливає на інші чотири програми), видалити WARфайл (і каталог веб-додатків), перерозгорнути новий WARфайл і перезапустити Tomcat.

Звичайно, це засмучує кількох людей, оскільки знищує всі введені сеанси для всіх програм.

Чи є кращий спосіб це зробити? Я маю на увазі, чи є спосіб перезавантажити лише КЛАС, який змінився замість усього на машині розробника?

Дякую.


Змінити управління сеансом на щось, що зберігається у файлі? Вибачте, не втримався :)
rogerdpack

1
@rogerdpack Я дізнався багато нового про Tomcat, оскільки поставив це питання шість років тому. Але все одно дякую.
cbmeeks

Що стосується гарячої заміни тільки класів см stackoverflow.com/questions/32459047 / ...
rogerdpack

Відповіді:


59

Ви пробували використовувати Tomcat's Manager ? Це дозволяє розгортати / розгортати військові файли, не вимикаючи Tomcat.

Якщо ви не хочете використовувати програму Manager, ви також можете видалити файл війни з каталогу webapps, Tomcat скасує програму через короткий проміжок часу. Потім ви можете скопіювати файл війни назад у каталог, і Tomcat розгорне файл війни.

Якщо ви використовуєте Tomcat у Windows, можливо, вам доведеться налаштувати ваш контекст, щоб не блокувати різні файли.

Якщо ви абсолютно не можете простоювати, можливо, ви захочете переглянути паралельні розгортання Tomcat 7. Ви можете одночасно розгорнути декілька версій веб-програми з однаковим контекстним шляхом. Правила, що використовуються для узгодження запитів із контекстною версією, такі:

  • Якщо в запиті немає інформації про сеанс, використовуйте останню версію.
  • Якщо інформація про сеанс присутня у запиті, перевірте менеджер сеансів кожної версії на наявність відповідного сеансу, і якщо такий знайдено, використовуйте цю версію.
  • Якщо інформація про сеанс присутня у запиті, але не вдається знайти відповідний сеанс, використовуйте останню версію.

Це теж гарна пропозиція. До сьогодні я ніколи не чув про додаток менеджера. Так, ми використовуємо Windows. Я маю занепокоєння щодо видалення файлу WAR та очікування - це те, що наші клієнти часто очікують "невеликих виправлень". Чи спрацювали б ці пропозиції для цього сценарію?
cbmeeks

1
@cbmeeks - Це залежить від того, як часто трапляються ці невеликі виправлення та як довго хтось помічає. І в тому, і в іншому випадку програма буде недоступною. Це залежить від вашого апаратного забезпечення / програми, скільки часу триває цей час. Але це вимірюється секундами, я б сказав, що зазвичай 5-10 у наших додатках. Але ваш пробіг може відрізнятися :)
Стів К

1
Ого. З того часу, як я поставив це питання, я дізнався так багато. Так, зараз ми розгортаємо програми Tomcat, не розкладаючи Tomcat повністю. Одне, що я зробив, це переконався, що всі журнали (програми та Tomcat) не записують журнали всередині папки webapps / application. Або налаштування Tomcat на не блокування також працює. Тож ми розмістили журнал у центральному місці поза папкою Tomcat. Працює як мрія. Але ваша відповідь була найкориснішою. Дякую!
cbmeeks

5
Під час повторного розгортання без перезапуску вам доведеться бути обережним із витоками пам’яті - дуже часто завантажувачі класів видаватимуть посилання, і вам потрібно перезапустити весь процес Tomcat, щоб звільнити пам’ять від старої версії програми. LiveRebel (згаданий в іншій відповіді) може автоматизувати все це для вас.
Neeme Praks

3
Вам не потрібно видаляти війну для передислокації. Просто скопіюйте стару війну і почекайте кілька секунд.
peceps

30

Є кілька простих способів.

  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. Скопіюйте вже розірваний "каталог" у папку webapps


1
Корисно знати, що метод 'touch' не перезавантажує класи. IOW, він не очищає та не перезавантажує ієрархію навантажувача класів для веб-додатка
Рондо

2
Побачивши, чому ці твори можна прочитати $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml спостерігається за змінами. Інші ресурси можна легко перерахувати там за необхідності.
Кевін

21

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


Віддайте перевагу застосунку менеджера. Це дорога операція для барана.
сортувальник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.