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

Внедрение Tomcat и Eclipse Zero Turnaround

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

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

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

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

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

<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. Любой ответ должен быть бесплатным решением.


Обновление

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

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

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

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

docBase="webapps/someExample"

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

4b9b3361

Ответ 1

В этих случаях я устанавливаю вывод сборки eclipse на WEB-INF/классы, как вы это делали, и создаете файл контекста с 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

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

Ответ 3

Попробуйте Spring Загруженный агент JVM, описанный в следующем ответе: fooobar.com/info/65088/...

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

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