2011-06-13 10 views
16

Я хочу иметь возможность разворачивать изменения кода в Tomcat (почти мгновенно), в то время как я развиваюсь в Eclipse.Развертывание нулевого оборота 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. Любой ответ должен быть решением бесплатно.


Update

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

значение ИСТИНА, если вы хотите, чтобы Catalina классов мониторов в/WEB-INF/классов/ и/WEB-INF/Lib для изменений, и автоматически загрузит приложение веб при обнаружении изменения.

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

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

docBase="webapps/someExample" 

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

ответ

5

Для этих случаев я устанавливаю вывод сборки 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" /> 
+0

Знаете ли вы, есть ли способ сделать это с помощью нескольких веб-приложений, запущенных в Tomcat? (Только один должен находиться на пути «выход сборки») – Mikaveli

+0

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

+0

У меня есть несколько веб-приложений, которые должны запускаться в одном экземпляре Tomcat - мне не нужно то же самое поведение «hot deploy» из них. – Mikaveli

2

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

+0

Я уже использую WTP. Полная переиздание моего проекта займет минуты, вот чего я пытаюсь избежать. – Mikaveli

+0

Это из-за перераспределения занимает так много времени? Я имею в виду перезапуск контекста сервлета и разогревание кешей (весна и т. Д.) Требует времени. Или что занимает так много времени? – toomasr

+0

Поскольку существует так много классов и файлов, сборка в Eclipse требует времени для очистки и повторной публикации. Если я изменю классы по мере того, как я иду, то просто перезагрузите контекст, это быстрее _much_. Также, пожалуйста, посмотрите мое обновление. Благодарю. – Mikaveli

0

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

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

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