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

Перезапустить tomcat при изменении файла класса?

Зачем нам нужно перезагружать сервер tomcat всякий раз, когда файл класса изменяется, нет другого пути?

4b9b3361

Ответ 1

Вы можете настроить Tomcat и сделать ваш webapp "перезагруженным". Для этого добавьте reloadable=true в элемент <Context> вашего веб-приложения. О атрибуте reloadable в документации говорится:

Установите для true, если вы хотите, чтобы Catalina контролировала классы в /WEB-INF/classes/ и /WEB-INF/lib для изменений и автоматически перезагружала веб-приложение, если обнаружено изменение. Эта функция очень полезна при разработке приложений, но для этого требуется значительная часть времени выполнения, и она не рекомендуется использовать в развернутых производственных приложениях. Поэтому значение по умолчанию для этого атрибута ложно. Однако вы можете использовать веб-приложение Manager, чтобы вызвать перезагрузку развернутых приложений по требованию.

Ответ 2

Конечно, есть! Запустите Tomcat в режиме разработки, затем каждый webapp перезапустится после перераспределения.

Из документов Tomcat:

Сервлет, который реализует Jasper, настраивается с использованием параметров init в вашем глобальном $CATALINA_BASE/conf/web.xml.

...

development - Используется ли Jasper в режиме разработки (будет проверяться на изменение JSP при каждом доступе)? true или false, по умолчанию true.

Есть настройки, которые вы можете изменить, чтобы настроить то, что Tomcat будет искать для проверки обновлений. Обычно я разворачиваю отдельные файлы классов в соответствующий каталог под WEB-INF/classes, а затем

touch WEB-INF/web.xml

запустить перезапуск приложения; Я думаю, что web.xml является одним из файлов Tomcat по умолчанию.

Ответ 3

В более общем случае причина, по которой вы должны это сделать, - это то, что в Java, когда загрузчик классов загружает класс, он не может его выгрузить. То, что Tomcat должен сделать, это использовать новый загрузчик классов и перезагрузить все классы, в которых он нуждается.

Ответ 4

Отметьте JRebel.

Ответ 5

Если вы разрабатываете, ваша среда IDE должна иметь возможность сделать это прозрачно на подходящем сервере. Например. Dynamic Web Project в Eclipse знает, как разговаривать с Tomcat.

При развертывании создайте WAR файлы и разверните их. Tomcat знает, как переустанавливать WAR файл.

Ответ 6

Если вы используете файлы WAR для развертывания, вы можете установить autoDeploy=true в конфигурацию Tomcat, что заставляет Tomcat наблюдать за корнем веб-приложения (по умолчанию "webapps" ) для новых или измененных файлов WAR. Если такой файл найден, он автоматически развертывается.

Как сказал Паскаль Тивент, вы можете использовать приложение Tomcat Manager (/manager/html) для запуска, остановки, развертывания и развертывания определенных приложений. Если файлы, которые вы меняете, находятся в определенном приложении, это хороший способ заставить Tomcat распознать изменения.

Ответ 7

Помимо установки autoDeploy = true в server.conf, вы также должны быть осторожны, чтобы не класть какие-либо классы в общий загрузчик классов. Классы, которые загружаются загрузчиком общего класса, не могут быть перезагружены.

Ответ 9

В вашем вопросе фактически не говорится о том, беспокоите ли вы о простои производства (т.е. уменьшите его, перезагрузив классы) или вы хотите непрерывную разработку. Поэтому я попытаюсь прояснить, используя следующие моменты:

1), используя <Context reloadable=true... в каталоге catalina.home/conf, вы можете убедиться, что ваш webapp перезагружается при изменении любого класса. Вы можете добавить список изменений ресурсов в элемент <WatchedResources>.

2) Но это перезагрузит контекст, повторно инициализирует загрузчик классов, очистит его кеш, и все будет выглядеть так, как будто веб-приложение только что началось.

Этот подход все равно оставит ваш сервер непригодным, потому что вы перезагрузили контекст сервлета. Истинным "перезагрузкой" является

1) Вы меняете байтовый код класса с некоторыми ограничениями 2) JVM вернет этот класс, когда вызывается "loadClass()" для этого загрузчика классов.

Это Java-инструментария. Вы можете написать свой собственный агент, который может подключиться к вашей JVM либо в начале, либо в полете. Однако вы не можете определить новый метод и изменить статические переменные. Это собственные ограничения JVM (для JVM Oracle HotSpot, о которых я знаю). Вы можете использовать другую JVM, например. DCEVM, который не имеет такого ограничения. Так что до вас, как вы хотите справиться с вашей проблемой. Если вы знаете, что делаете (!), Вы можете уйти с заменой классов один за другим. И вы даже можете определить "Brand New Class", ссылайтесь на объект/метод класса в существующем/загруженном классе и заставляйте его подбирать изменения.

Надеюсь, это поможет. Все ответы здесь - то, что вам нужно, чтобы принять ваше решение.