Интеграция tomcat и eclipse как среды горячего развертывания


88

Я хотел бы настроить eclipse и tomcat интегрированным образом, чтобы изменения в моих JSP и сервлетах (если это возможно) отражались немедленно, без необходимости развертывания.

Хорошо, это один из тех вопросов, на который есть множество ответов в Интернете, но все они кажутся разными. (используйте плагин Sysdeo, используйте плагин JBOss, делайте что-нибудь с устаревшим Eclipse, используйте вместо него MyEclipse и т. д.), и я не смог найти 1 исчерпывающий ресурс, на который можно сослаться. Итак, для моей выгоды, какова самая простая и наиболее рекомендуемая процедура для этого?

Это предполагает, что у меня есть eclipse и tomcat, работающие независимо. Мне действительно удалось интегрировать их в режиме без горячего развертывания, используя инструкции здесь: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Версия Eclipse Версия: 3.4.2 (Ганимед) Tomcat v6.0.20


17
4 года спустя меня сбивает с толку тот факт, что это все еще проблема. Да ладно, это довольно фундаментально.
— Конрад Гарус

7 лет спустя (почти) я думаю, что
— нашел

Ответы:


75

Есть два варианта.

Во-первых, Eclipse позволяет это сделать с небольшим изменением конфигурации (см. Также этот подробный пост )

  • добавить Tomcat в список серверов
  • сделать проект «Динамический веб-проект» (либо через мастер создания, либо через раздел фасетов в настройках)
  • добавьте проект в tomcat и настройте его «сборку развертывания»
  • дважды щелкните Tomcat из списка, чтобы открыть настройки
  • Измените "Публикация" на "Никогда не публиковать автоматически" (это означает, что сервер не будет перезапущен, когда вы нажмете ctrl + s)
  • запустить Tomcat в режиме отладки

Это по-прежнему будет отражать изменения кода, но не перезапустит сервер.

Во-вторых, давно пользуюсь плагином FileSync :

  • настроить плагин для отправки всех классов из директории bin в WEB-INF/classesвашу установку tomcat (это почти то же самое, что и настройка сборки развертывания)
  • настроить все другие ресурсы для перехода в соответствующие места
  • при желании, перенести все абсолютные пути из настроек местоположения filesync в одну переменную и настроить эту переменную в eclipse (таким образом, вы также сможете зафиксировать настройки filesync, если все члены используют eclipse)
  • добавьте Tomcat в список серверов в eclipse, настройте параметр «Расположение серверов» на «Использовать установку tomcat» (экран открывается, когда вы дважды щелкаете tomcat из списка серверов)
  • запустить Tomcat в режиме отладки

У меня это прекрасно работает. Каждое неструктурное изменение отражается немедленно, без повторного развертывания.

Обновление:
вы можете узнать больше о методах горячего развертывания здесь .
Я также создал проект, который легко синхронизирует рабочую область с контейнером сервлета.


@VladimirTsvetkov нет - это два разных варианта
— Божо

Я пробую ваш первый подход, но я использую Maven Overlays, и когда я меняю файл в одном из оверлеев, сервер все равно перезагружается (оверлей - это не динамический веб-проект, а динамический веб-модуль). Любые идеи?
— Hoffmann

2
У меня сложилось впечатление, что при изменении «Публикация» на «Никогда не публиковать автоматически» JSP больше не перезагружаются / не перекомпилируются при изменении. Часть перезагрузки класса работает нормально, запустив Tomcat в режиме отладки.
— yglodt

5
Я делаю это по-другому: сначала меняю на автоматическую публикацию; во-вторых, нажмите Modulesвкладку в конфигурации сервера, затем нажмите edit, снимите флажок auto deploy enabled, я думаю, что это самый простой способ. PS: ваш первый способ мне не подходит.
— hiway 07

@hiway, где эта вкладка "Модули" внутри вкладки конфигурации сервера?
— Mateus Viccari

30

Просто позвольте eclipse записывать файлы классов прямо в каталог $ TOMCAT / webapps / MyWebApp / WEB_INF / classes. Затем настройте apache-tomcat, чтобы проверить, были ли обновлены файлы классов, и перезагрузите их, если они есть.

Чтобы настроить tomcat для автоматической перезагрузки класса при его изменении, вам необходимо

отредактируйте $TOMCAT/conf/context.xmlи установите:

<Context reloadable="true"> 

Возможно, вам также придется отредактировать и перезагрузить webapps/$YourWebApp/web.xmlфайл, включив в него:

<web-app reloadable="true">

Я не могу вспомнить, нужны ли оба изменения, но именно так я настроил свой tomcat-6.0.18 на автоматическую перезагрузку.


Согласно документации, tomcat.apache.org/tomcat-6.0-doc/config/context.html они рекомендуют не размещать Contextэлементы в файле server.xml, но он должен отслеживать / WEB-INF / classes / и / WEB-INF / lib для любых изменений. Где вы читали об атрибуте web-appэлемента?
— Michael

Извините, я немного неправильно прочитал ваш ответ. Context.xml «должен загружаться для каждого веб-приложения».
— Michael

2
Как вы настраиваете, куда Eclipse записывает файлы классов?
— yglodt

7

Отказ от ответственности : я просто счастливый клиент, я не работаю в Zero Turnaround и никоим образом не связан с ними.

Обратите внимание на JRebel - он позволяет писать код без перезапуска веб-приложений. Это в основном работает путем инструментовки ваших классов и адаптации их изменений. Он обрабатывает гораздо больше случаев, чем горячее развертывание , в том числе:

  • Добавление / удаление методов
  • Добавление / удаление конструкторов
  • Смена интерфейсов
  • Добавление / удаление реализованных интерфейсов

Он коммерческий ( информация о ценах , 550 долларов в год по состоянию на июнь 2018 года), и в нем есть множество плагинов для сторонних фреймворков, в том числе:

  • Guice
  • весна
  • Распорки 2

Вы получаете бесплатную пробную версию довольно безболезненно - я предлагаю вам попробовать.


2
Джребель, когда это работает, это работает. Когда этого не происходит, это кошмар. Я бился головой об их поддержке больше недели, и я все еще не могу заставить ее работать в моей простой весенней настройке mvc. Они больше не помогут, если я не отправлю им свое приложение или helloworld моего приложения. И ваши цены устарели - теперь они заряжают бомбу. Слава богу, я использовал только их пробную версию
— happybuddha

Текущая цена составляет 365 долларов в год за место
— Джозеф Ласт,

А теперь его 550 долларов в год за место
— frewper

3

Измените свое рабочее пространство в Eclipse на \ tomcat \ webapps. Поскольку оно предназначено только для вашей работы, это должно работать нормально. Какие бы изменения вы ни вносили в Eclipse, они находятся в том же каталоге, что tomcat ищет приложения для развертывания.


3

В представлении серверов создайте новый сервер, пока не добавляйте на сервер никаких ресурсов (проектов). Дважды щелкните сервер в расположении серверов. Выберите «Использовать установку tomcat». Измените «Путь развертывания» к каталогу развертывания Tomcat (Пример: c: \ server \ Tomcat 7.0.14 \ webapps). Расширить «Издательский раздел». Установите флажок «Автоматически публиковать после события сборки». Сохрани и закрой. В меню eclipse отметьте «Проект -> Создавать автоматически». В представлении серверов щелкните правой кнопкой мыши на своем сервере, «Добавить и удалить», опубликуйте свой проект.


2

Почему бы не использовать интегрированный сервер Tomcat из eclipse, если он предназначен только для разработки? Вы можете настроить серверы в окне-> настройки. После настройки, если у вас есть jsp с именем page.jsp, вы можете щелкнуть его правой кнопкой мыши и выбрать запускать на сервере. В настройках-> Общие-> Веб-браузер вы можете выбрать погоду для использования встроенного браузера или внешнего. Внесите некоторые изменения в свой jsp, сохраните и обновите страницу в браузере. Изменения будут автоматически отражены после сохранения и обновления данных в браузере.


2

Что мне здесь подходит:

context.xml вот так:

<Context path="/myapp" docBase="myapp" debug="5"
    reloadable="false" antiResourceLocking="false" antiJARLocking="true">
<!-- this because i´m using Spring 3.1 with Tomcat -->
    <Loader     loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />

</Context>

Затем на вкладке «Серверы» в Eclipse на вкладке «Модули» я отключил «Автоматическую перезагрузку» для всех развертываемых модулей.

Также позвольте конфигурации по умолчанию разрешить автоматическую публикацию.

И при использовании Maven с WTP не забудьте оставить содержимое src / main / resources в, потому что Eclipse настаивает на исключении содержимого этой папки из окончательной сборки.

Только при всем этом я получил полноценные (ВМ) классы hot-deploy с ресурсами hot-deploy !!!


1

В своей среде разработки просто укажите свой сервер Tomcat для поиска JSP в любом каталоге, в котором вы их разрабатываете. Как только вы сохраните файл, вы сможете увидеть изменения.


1

Мне удалось заставить это работать в моей среде разработки с помощью агента Spring Loaded JVM. Хотя я разрабатываю веб-приложения Spring, в описании этого проекта упоминается, что это

можно использовать с любым байт-кодом, который может работать на JVM

Используя следующую настройку, я смог получить изменения для автоматической публикации в подключенном экземпляре Tomcat (обычный метод Eclipse WTP). Я использую Spring Tool Suite 3.7.3 на основе Eclipse Mars.2 (4.5.2).

  1. Загрузите последний выпуск JAR Spring Loaded из их проекта Github . Это было протестировано с помощью springloaded-1.2.5.RELEASE.jar.
  2. Настройте Tomcat Server в Eclipse как обычно (проверено с Tomcat 8.0.30)
  3. Откройте страницу конфигурации Tomcat Server в Eclipse (дважды щелкните экземпляр сервера на вкладке «Серверы»).
  4. В разделе «Параметры сервера» снимите флажок «Автоматическая перезагрузка модулей по умолчанию».
    • Примечание. Если у вас уже есть веб-модули, добавленные на сервер, вам может потребоваться отключить «Автоматическую перезагрузку» для них по отдельности на вкладке «Модули» (внизу окна страницы конфигурации).
  5. В разделе «Общая информация» нажмите «Открыть конфигурацию запуска».
    • На вкладке «Аргументы» добавьте следующее в конец «Аргументы ВМ»: -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • Чтобы включить просмотр JAR-файлов в дополнение к .classфайлам проекта , настройте -Dspringloaded=watchJars=аргумент VM в соответствии с комментариями к этой проблеме .

Запустите сервер и опубликуйте на нем проекты динамических веб-приложений, как обычно. Опять же, я смог проверить это с помощью веб-приложений Spring. Например, изменение кода, методы добавления / вычитания и т. Д. В классах @Controller применялись почти сразу после того, как я сохранил файл и Eclipse построил и опубликовал измененный класс. Наконец, в разделе часто задаваемых вопросов проекта Spring Loaded упоминается несколько случаев, когда что-то не перезагружается, поэтому для этого потребуется перезапуск сервера / приложения. Но эти исключения гораздо реже.

Еще одно замечание: это НЕ работает со встроенным сервером Pivotal tc Server или VMware vFabric tc Server, который поставляется с STS. Для этих серверов есть опция «Включить перезагрузку на основе агента Java (экспериментальная)», но для этого используется более старая версия Spring Loaded 1.2.0, которая у меня не сработала.


Кажется, вы должны принять это Spring, как насчет Non Springприложения.
— Tangoo

Хотя вам нужно настроить SpringLoaded JAR для Tomcat, сами запущенные приложения НЕ обязательно должны быть приложениями Spring (и не включать в себя какие-либо Spring JAR). Я успешно протестировал это с помощью простого одиночного сервлета HelloWorld.
— martian111

0

Готовы ли вы использовать Jetty в целях разработки?

Если это так, с Maven довольно просто использовать - просто запустите mvn jetty:run


0

Возможно, это не лучший способ, но у меня он работает.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / сервлет проекта / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (должен экспортировать jar в каталог lib в $ contextPath)
  • $ eclipseWorkbench / проект-jsp /

Я использую команду rsync для синхронизации изменений из моего проекта jsp с $ contextPath.

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


0

мы можем использовать опцию ниже? Дважды щелкните Сервер в eclipse -> Расположение серверов -> Использовать установку tomcat. Он берет на себя управление установкой tomcat. Вам не нужно перезапускать сервер для изменений в java-классах.


0

Я нашел самый простой способ: использование символических ссылок: я думаю, что это самый быстрый способ, потому что нет никакой синхронизации: каталог tomcat и каталог вашего проекта всегда будут в одном каталоге.

Tomcat будет периодически обнаруживать изменения и повторно развертывать ваше приложение.

Существует также способ отладки вашего приложения, поэтому я скромно считаю, что это хорошее решение.

Я задокументировал здесь свое решение для всех, кто заинтересован.


Могу ли я узнать, почему необходимо использовать удаленное Java-приложение, поскольку оно использует localhost, что означает, что я отлаживаю свою собственную локальную машину
— Карен Го

0

Если вы торопитесь:

  1. отметьте «никогда не публиковать автоматически» в tomcat (другом контейнере) в eclipse.
  2. запустить tomcat (другой контейнер) в режиме отладки.

вуаля! :)


0

В Eclipse щелкните «Проект» в верхнем меню и убедитесь, что выбрано «Построить автоматически». Это устранило мою проблему. Я запускал Eclipse с Tomcat, используя метаданные моей рабочей области. Я также запускал Maven в проекте динамического веб-модуля. Для проверки добавьте свое приложение в Tomcat. Запустите Tomcat из Eclipse. Убедитесь, что ваше приложение развернуто и работает. Откройте вкладку «Консоль» в Eclipse. Внесите изменения в свое приложение. Через пару секунд вы должны увидеть, как ваше изменение автоматически создается и развертывается в Tomcat.


-2

Самый простой и быстрый: настройте Eclipse на создание файла WAR при сборке; в качестве шага после сборки скопируйте этот файл WAR в каталог веб-приложений tomcat. Tomcat распознает изменение и обновит сайт без необходимости развертывания. Обратите внимание, что это не идеально; пользователи, использующие это веб-приложение, могут иметь менее оптимальные возможности, поскольку Tomcat перезапускает веб-приложение «под» ними; но это соответствует вашему запросу.


1
хорошо ... Думаю, я не прояснил свои намерения. Я действительно не заинтересован в развертывании приложения для некоторых пользователей, но я пытаюсь запустить tomcat с eclipse для своих повседневных нужд разработки и сократить цикл обратной связи (внести изменения) -> (см. Результат) вместо (Сделать Изменить) -> Развернуть -> (См. Результат)
— удалить
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.