1 Обзор
Так называемое горячее развертывание для приложений Java заключается в обновлении файлов классов Java во время выполнения.IDEA может использовать встроенный метод горячего развертывания Spring Boot для локального/удаленного горячего развертывания или использовать JRebel для локального/удаленного горячего развертывания, но Необходимо установить подключаемые модули JRebel и XRebel для IntelliJ. В этой статье будут представлены эти два метода горячего развертывания. Это должна быть самая подробная статья о горячем развертывании IDEA, которую можно найти в Интернете. Я считаю, что после ее прочтения эффективность разработки будет значительно улучшен. , больше не нужно вручную набирать пакет jar/war и загружать его на сервер, как раньше, и ряд громоздких операций.
2 Окружающая среда
- IDE:IntelliJ IDEA 2019.3.1
- Местный кот: 9.0.30
- JRebel and XRebel for IntelliJ:2020.2.0
- Сервер: CentOS 8.1.1911
- Сервер Томкат: 9.0.33
3 Горячее развертывание IDEA
3.1 Инженерная часть
3.1.1 Новый проект
Здесь создается новый проект Spring Boot для тестирования горячего развертывания.
Метод упаковки изменен на war, потому что внешний Tomcat будет использоваться позже: Проверьте средство горячего развертывания Spring Boot DevTools и Spring Web со встроенным Tomcat.3.1.2 Тестовые файлы
Контроллер Получить новый запрос в ответ на:
Здесь добавлено консольное сообщение для удобства просмотра.3.2 Внутреннее горячее развертывание Tomcat
Spring Boot имеет встроенный Tomcat, который можно использовать непосредственно для горячего развертывания.
3.2.1 Настройки IDEA
Во-первых, вам нужно включить автоматическую сборку проекта в компиляторе:
Затем дважды нажмите Shift, переключитесь на «Действие» и выполните поиск в реестре:Включите компилятор.automake.allow.when.app.running:Наконец, отредактируйте настройки запуска:Выберите один из следующих двух вариантов, чтобы обновить классы и ресурсы:3.2.2 Тестирование
IDEA поставляется с HTTP-клиентом (на самом деле это плагин, который можно закрыть без необходимости), который может отправлять HTTP-запросы и создавать новый HTTP-запрос:
Назовите как хотите:Добавьте GET-запрос:Измените путь и порт, обратите внимание на соответствующий путь:Вернитесь к настройкам запуска Spring Boot, Shift+F10 для запуска:Затем вы можете отправить HTTP-запрос, нажав на маленький зеленый треугольник:Соответствующая информация возвращается, и консоль также имеет соответствующий вывод: Затем измените тест в контроллере на test1:Не перезапуская проект, переключите окно и позвольте IDEA выполнить операцию обновления: Консоль повторно напечатает слово Spring, и вы увидите сообщение Сборка завершена успешно в сообщениях, указывающее, что операция обновления выполнена успешно. Повторно отправьте исходный HTTP-запрос и сообщите об ошибке:Поскольку в настоящее время нет возможности ответить на localhost:8080/test, после изменения на test1:3.3 Внешнее горячее развертывание Tomcat
Так как соответствующие настройки IDEA были настроены, здесь повторяться не будем, если не настроен, настройте как указано выше, а затем нужно добавить внешнюю конфигурацию Tomcat.
3.3.1 Внешняя конфигурация Tomcat
Необходимо добавить внешнюю конфигурацию запуска Tomcat:
Добавьте Tomcat и выберите локальный:Если Tomcat не отображается, см. дополнительные элементы здесь. Измените имя, Configure выбирает путь к локальному Tomcat и удаляет следующую сборку.Разверните здесь, чтобы выбрать взорванный: Вернитесь к корневому пути:Вернитесь на вкладку «Сервер» и измените следующие два элемента на «Обновить классы и ресурсы»:3.3.2 Тестирование
Обратите внимание, что внешнее горячее развертывание Tomcat не может быть запущено с помощью команды «Выполнить» и не может быть запущено напрямую с помощью Shift + F10, как внутреннее развертывание.Чтобы использовать отладку для запуска, Shift + F9:
Вам нужно убедиться, что порт по умолчанию 8080 не занят, сначала приостановите приложение Spring Boot прямо сейчас, запустите здесь, и Tomcat здесь, в службах.Тестовый файл по-прежнему является test1, отправьте запрос:Затем измените тело метода test1:После переключения окон будет предложено перезагрузить класс:Отправьте предыдущий HTTP-запрос еще раз: успех! Однако такое горячее развертывание может изменить только тело метода.Если метод добавлен или исходное имя метода изменено и т. д., появится сообщение о том, что горячая замена не удалась, а виртуальная машина не поддерживает эту операцию:Зайдите во всемогущий Baidu, чтобы проверить:Говорят, что это ограничение Java HotSwap.HotSwap - это патч JVM, который здесь пропущен.В то же время некоторые сторонние инструменты, такие как JRebel, могут поддерживать этот тип модификации.Конечно, будет подробное введение ниже.3.4 Горячее развертывание удаленного Tomcat
Удаленное горячее развертывание Tomcat более проблематично, есть много деталей, а ошибка порта - это набор исключений, поэтому, пожалуйста, наберитесь терпения и присмотритесь.Требуется три шага: установить Tomcat сервера, настроить конфигурацию сервера IDEA и установите рабочую конфигурацию Tomcat в IDEA. Наконец, проверьте файл .
3.4.1 Настройки Tomcat для сервера
Необходимо обрабатывать четыре порта: HTTP-порт Tomcat, порт JMX, порт RMI и порт отладки. Порт HTTP часто называют портом Tomcat.Браузер может получить доступ к домашней странице Tomcat по умолчанию, введя http://ip:port, который установлен в server.xml.
Создайте новый setenv.sh в каталоге bin Tomcat:CATALINA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.rmi.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=ip
-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:12345,suspend=n,server=y"
Порты JMX и RMI настроены одинаково, пока они не заняты, их можно взять по желанию.12345 за адресом - это порт отладки, который можно установить по мере необходимости.ip - это ip-адрес сервер
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
Эти две строки указывают на то, что при подключении к Tomcat без использования ssl и с использованием клиента JMX аутентификация не требуется. Примечание для добавления
-Dcom.sun.management.jmxremote.rmi.port=8888
Этот порт RMI, многие статьи не добавляют это и приводят к сбою развертывания. Наконец, измените разрешение на выполнение и запустите tomcat:
chmod 750 setenv.sh
./startup.sh
Вы можете проверить прослушивание порта:
netstart -ano | grep -E "8080|8888|12345"
Все три порта отслеживаются, что указывает на успешность настройки.Если эти три порта не отслеживаются, проверьте журнал Tomcat.
В то же время обратите внимание на проблему брандмауэра и группы безопасности.Если брандмауэр включен, пожалуйста, разрешите эти три порта пройти, и группа безопасности также должна открыть соответствующие правила порта.
3.4.2 Настройки сервера в IDEA
Создайте новое развертывание SFTP:
ip — это ip-адрес сервера, port — это ssh-порт, метод аутентификации может быть паролем или ключом, выберите по мере необходимости, корневой путь установлен на путь webapps tomcat, если есть проблема с искаженными символами, измените кодировку следующие дополнительные параметры для utf-8.Протестируйте его после настройки.Сопоставление: ниже приведены полные инструкции, локальный путь — это локальный путь проекта, путь развертывания — это путь относительно веб-приложений (корневой путь указан выше для веб-приложений), а веб-путь — это путь относительно URL-адреса.3.4.3 Настройки Tomcat в IDEA
Создайте новый Tomcat Remote:
Вот самая важная настройка, установите порт JMX (здесь 8888, установленный в 3.4.1 выше), Хост выбирает сервер, созданный на предыдущем шаге, Путь от корня — это корневой путь, Сопоставляется как путь веб-приложений, а port в разделе Host — это порт TomcatHTTP (здесь используется порт 8080 по умолчанию, и конфигурация в 3.4.1 подробно описана).Для развертывания здесь выберите развернутый военный пакет, а в контексте приложения выберите корневой путь.Отладка здесь, чтобы изменить набор портов в 3.4.1:3.4.4 Тестирование
Необходимо запускать в режиме отладки (Shift+F9), а не запускать напрямую (Shift+F10):
Сначала вам будет предложено подключиться к серверу и виртуальной машине:Затем запросите успешное развертывание:В это время браузер должен открываться автоматически, потому что URL настроен на открытие после запуска:После изменения тела метода нажмите Ctrl+F9, чтобы запросить перезагрузку класса:В сообщении Debug говорится, что класс был перезагружен:Это делает горячее развертывание успешным. Конечно, как и при использовании внешнего Tomcat выше, если вы измените имя метода или добавите метод, вам будет предложено, что виртуальная машина не поддерживает операцию (решение состоит в использовании следующего JRebel):4 Горячее развертывание JRebel
4.1 Введение в JRebel
JRebel — это агент JVM, который интегрируется с сервером приложений и может перезагружать классы с помощью существующих загрузчиков классов.Только измененные классы перекомпилируются и перезагружаются на лету в работающем приложении.4.2 Установка
Установите из плагинов в настройках и найдите его:
Если скорость низкая, то можно скачать с официального сайта (кликните сюда) для загрузки, а затем установить локально:4.3 Внутреннее горячее развертывание Tomcat
Внутреннее горячее развертывание TOCMAT очень простую. После выбора конфигурации Springboot Run, просто нажмите Rebel Run:
Консоль предлагает перезагрузить класс и перенастроить bean-компонент, указывая на успех.Конечно, предпосылкой этого является то, что конфигурация Spring Boot по умолчанию была настроена, как в 3.2 выше, например, если она изменена на:Таким образом, JRebel не будет иметь никакого эффекта.4.4 Внешнее горячее развертывание Tomcat
После настройки внешнего Tomcat, как в 3.3 выше, это также прямой запуск Rebel одним щелчком мыши. Убедитесь, что порт не занят.
По сравнению с горячим развертыванием по умолчанию, самое большое отличие здесь в том, что он позволяет добавлять и изменять методы, а не просто модифицировать тело метода (иначе проблема 3.3 не возникнет). Вот метод в оригинальном контроллере:После добавления метода: Подсказка была перезагружена, указывая на успех, вместо запроса на операцию, не поддерживаемую виртуальной машиной.4.5 Горячее развертывание удаленного Tomcat
Горячее развертывание удаленного Tomcat с использованием JRebel необходимо упаковать и загрузить перед горячим развертыванием.
4.5.1 Загрузка пакета
Перед горячим развертыванием необходимо вручную упаковать:
Загрузите его в веб-приложения Tomcat на сервере.4.5.2 Новый сценарий
Выберите запуск на удаленном сервере или виртуальной машине, затем выберите Tomcat:Следуйте инструкциям, чтобы создать новый скрипт:Фактическое измерение также требует изменения разрешений скрипта, 750:После запуска вы можете увидеть вывод JRebel: JRebel запущен в режиме удаленного сервера: Это позволит вам успешно отслеживать изменения.4.5.3 Добавить удаленный сервер
Имя сервера — произвольное, а URL — ip + порт (обратите внимание, что брандмауэр сервера и открытый порт группы безопасности регулируют), если установлена аутентификация сервера (черезjava -jar xxx.jar -set-remote-password PASSWORD
Настройки), вам необходимо проверить аутентификацию сервера и ввести пароль. Если Tomcat устанавливает пароль доступа (метод установкиПосмотреть здесь), вам нужно проверить базовую аутентификацию HTTP и заполнить имя пользователя и пароль:
Проверьте соединение:Нет проблем, переходите к следующему шагу.4.5.4 Тестирование
Затем откройте JRebel и выберите развернутый проект:
Ниже приведен метод Controller в упакованном виде только с одним тестом:Test (обратите внимание, что путь перед test — это имя пакета, которому должно соответствовать): Затем добавьте метод test1, ctrl+F9 и соберите:На стороне сервера предлагается перезагрузить класс:Введите test1 еще раз:Это будет успешным при удаленном развертывании тепла!5 Приложение: упаковка банки
Поскольку в Spring Boot встроен Tomcat, его можно упаковать в пакет jar для использования встроенного Tomcat. Таким образом, можно избежать ряда громоздких конфигураций Tomcat, включая сопоставление каталогов и порты. На основе исходного пакета war , измените
java -jar demo.jar
Если нет проблем, вы можете загрузить его на сервер или использовать горячее развертывание напрямую.Обратите внимание, что Tomcat и JRebel необходимо изменить соответствующую конфигурацию, поэтому я не буду вдаваться в подробности.
Если вы считаете, что статья хорошая, ставьте лайк.
В то же время приглашаем обратить внимание на публичный аккаунт WeChat: Bingling Road.