Развертывание Tomcat и Eclipse с нулевым оборотом - PullRequest
16 голосов
/ 13 июня 2011

Я хочу иметь возможность развертывать изменения кода в Tomcat (почти мгновенно), пока я занимаюсь разработкой в ​​Eclipse.

Пока что мой вывод из Eclipse помещает встроенные классы в WEB-INF/classes папка моего веб-приложения.

У меня также есть перезагружаемый контекст с web.xml в качестве отслеживаемого ресурса.Любое редактирование / сохранение этого файла делает перезагрузкой моего веб-приложения, что занимает чуть более одной секунды - гораздо быстрее, чем создание нового файла войны и его полное развертывание.

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

Я читал, что могу добавить дополнительные отслеживаемые ресурсы в context.xml Tomcat, но это не совсем то, что мне нужно - если только невозможно указать каталог, который будет отслеживаться (включая рекурсивный мониторингподпапки и файлы)?

<Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/someother.file</WatchedResource>
  <Manager pathname=""/>
</Context>

По сути, мой вопрос заключается в том, могу ли я просмотреть всю папку классов (без явного включения каждого WatchedResource), чтобы инициировать повторное развертывание в Tomcat?

Если нет, могу ли я настроить Eclipse для touch файла web.xml, когда я сохраняю исходный файл в этом проекте?Я занимаюсь разработкой в ​​системе Windows.: (


PS Мне не интересен продукт JRebel. Любой ответ должен быть free solution.


Update

В соответствии с документацией Tomcat , следует отслеживать папку классов, устанавливая контекст для перезагрузки:

Установите значение true, если вы хотите, чтобы Catalinaследите за изменениями в классах в / WEB-INF / classes / и / WEB-INF / lib и автоматически перезагружайте веб-приложение при обнаружении изменений.

Кажется, что изменения вносятся только в файл web.xml.вызвать перезагрузку. Это ошибка или мои настройки неверны?

Кроме того, я читал об установке атрибута docBase для данного контекста:

docBase="webapps/someExample"

Это выглядит какбыть ближе к тому, что мне нужно, так как я мог бы быстро переиздать в Eclipse. Моя единственная проблема заключается в том, что мне требуется, чтобы несколько веб-приложений / сервлетов работали в Tomcat одновременно, на одном и том же порту и т. д.

Ответы [ 3 ]

5 голосов
/ 17 июня 2011

Для этих случаев я установил вывод сборки eclipse на WEB-INF / classes, как вы сделали, и создал файл контекста с docBase, установленным в папку webapp (родительский элемент WEB-INF) в проекте.Это вручную помещается в conf / Catalina / localhost (при условии настройки по умолчанию для некоторых элементов server.xml).Конечным результатом является то, что tomcat завершает обслуживание из каталога разработки.Итак, измените сервлет или другой класс, и он будет обновлен в папке классов.Сохраните jsp, и он сразу станет доступен.

Если проект структурирован как:

src
|-main
  |-webapp
    |-images
    |-js
    |-WEB-INF
      |-jsp
      |-classes

Тогда контекст будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/path" reloadable="true" 
    docBase="<pathtoproject>/src/main/webapp" />
2 голосов
/ 13 июня 2011

Может быть, вам поможет проект веб-инструментов Eclipse с включенным автоматическим повторным развертыванием? Добавьте сервер, откройте свойства и в разделе «Публикация» вы увидите радиокнопку «Автоматически публиковать при изменении ресурсов». Это приведет к повторному развертыванию, если классы изменятся, иначе просто перезапишут ресурсы. Вы можете установить WTP через встроенный сайт обновлений (только Eclipse), так что следите за обновлениями программного обеспечения. Он бесплатен для большинства серверов, но не поддерживает некоторые функции Websphere?

0 голосов
/ 06 мая 2016

Попробуйте агент Spring Loaded JVM, который я описал в следующем ответе: https://stackoverflow.com/a/37064672/1034436

Хотя это работало для моего веб-приложения Spring, оно должно работать с ванильными Eclipse + WTP + Tomcat + динамическими веб-приложениями, поскольку Spring Loaded работает на уровне JVM / загрузки классов.

Вам все равно нужно будет использовать «Автоматически публиковать при изменении ресурсов», как упоминал @toomasr в своем ответе. Однако , вы также должны отключить опцию «Автоматическая перезагрузка модуля по умолчанию». Если вы уже добавили / опубликовали модули из Eclipse в Tomcat, отключите «Автоматическую перезагрузку» для каждого веб-модуля (через вкладку «Модули» на странице конфигурации Tomcat). Это должно помешать Tomcat перезагрузить приложение при обновлении одного файла класса, и я подозреваю, что это все время перезагрузки / ожидания.

...