Интеграция 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 ищет приложения для развертывания.

PaganSensei
источник
3

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

ticu0000
источник
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 !!!

Chuckedw
источник
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, которая у меня не сработала.

марсианин111
источник
Кажется, вы должны принять это 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, что позволит ограниченную горячую замену кода. Если вы измените статические поля или добавите методы, вам нужно будет экспортировать банку и перезапустить контекст.

TJR
источник
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.

NLessani
источник
-2

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

Поль Сонье
источник
1
хорошо ... Думаю, я не прояснил свои намерения. Я действительно не заинтересован в развертывании приложения для некоторых пользователей, но я пытаюсь запустить tomcat с eclipse для своих повседневных нужд разработки и сократить цикл обратной связи (внести изменения) -> (см. Результат) вместо (Сделать Изменить) -> Развернуть -> (См. Результат)
удалить