Перейти к основному содержимому

Отладка приложений Spring

· 7 мин. чтения

1. Введение

Отладка — один из самых важных инструментов для написания программного обеспечения.

В этом руководстве мы рассмотрим некоторые способы отладки приложений Spring.

Мы также увидим, как это упрощают Spring Boot, традиционные серверы приложений и IDE.

2. Аргументы отладки Java

Во-первых, давайте посмотрим, что Java дает нам из коробки.

По умолчанию JVM не включает отладку . Это связано с тем, что отладка создает дополнительные накладные расходы внутри JVM. Это также может быть проблемой безопасности для общедоступных приложений.

Поэтому отладку следует выполнять только во время разработки , а не в производственных системах.

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

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Давайте разберем, что означает каждое из этих значений:

-agentlib:jdwp

Включите агент Java Debug Wire Protocol (JDWP) внутри JVM. Это основной аргумент командной строки, который включает отладку.

транспорт = dt_socket

Используйте сетевой сокет для отладочных соединений. Другие варианты включают сокеты Unix и общую память.

сервер=y

Слушайте входящие соединения отладчика. Если установлено значение n , процесс попытается подключиться к отладчику вместо ожидания входящих подключений. Дополнительные аргументы требуются, когда установлено значение n .

приостановить=n

Не ждите отладочного соединения при запуске. Приложение запустится и будет работать нормально, пока не будет подключен отладчик. Если установлено значение y , процесс не запустится, пока не будет подключен отладчик.

адрес=8000

Сетевой порт, который JVM будет прослушивать для отладочных подключений.

Приведенные выше значения являются стандартными и подходят для большинства вариантов использования и операционных систем. Руководство по подключению JPDA более подробно описывает все возможные значения.

2.1. Адрес привязки на JDK9+

В JDK8 и более ранних версиях установка свойства адреса только для номера порта (адрес = 8000 в приведенном выше примере) означает, что JVM прослушивает все доступные IP-адреса. Таким образом, удаленные подключения доступны из коробки.

Это изменилось в JDK9+ по соображениям безопасности. В настоящее время настройка по умолчанию разрешает только подключения к локальному хосту.

Это означает, что если мы хотим сделать доступными удаленные подключения, нам нужно либо указать префикс имени хоста перед номером порта — адрес = мой хост: 8000 — либо использовать звездочку для прослушивания всех доступных IP-адресов — адрес = *: 8000.

3. Приложения Spring Boot

Приложения Spring Boot можно запускать несколькими способами . Самый простой способ — из командной строки с помощью команды java с параметром -jar .

Чтобы включить отладку, мы просто добавим аргумент отладки, используя параметр -D :

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar myapp.jar

С Maven мы можем использовать предоставленную цель запуска , чтобы запустить наше приложение с включенной отладкой:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000"

Точно так же с Gradle мы можем использовать задачу bootRun . Во-первых, мы должны обновить файл build.gradle , чтобы убедиться, что Gradle передает аргументы командной строки в JVM:

bootRun {
systemProperties = System.properties
}

Теперь мы можем выполнить задачу bootRun :

gradle bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

4. Серверы приложений

Хотя Spring Boot стал очень популярным в последние годы, традиционные серверы приложений по- прежнему широко распространены в современных программных архитектурах. В этом разделе мы рассмотрим, как включить отладку для некоторых наиболее популярных серверов приложений.

Большинство серверов приложений предоставляют сценарий для запуска и остановки приложений. Включение отладки обычно сводится к добавлению дополнительных аргументов в этот сценарий и/или установке дополнительных переменных среды.

4.1. Кот

Сценарий запуска для Tomcat называется catalina.sh ( catalina.bat в Windows). Чтобы запустить сервер Tomcat с включенной отладкой, мы можем добавить jpda к аргументам:

catalina.sh jpda start

Аргументы отладки по умолчанию будут использовать сетевой сокет, прослушивающий порт 8000 с suspend=n . Их можно изменить, установив одну или несколько следующих переменных среды: JPDA_TRANSPORT , JPDA_ADDRESS и JPDA_SUSPEND .

Мы также можем получить полный контроль над аргументами отладки, установив JPDA_OPTS . Когда эта переменная установлена, она имеет приоритет над другими переменными JPDA. Таким образом, это должен быть полный аргумент отладки для JVM.

4.2. муха

Сценарий запуска для Wildfly — это stand-alone.sh . Чтобы запустить сервер Wildfly с включенной отладкой, мы можем добавить –debug .

Режим отладки по умолчанию использует сетевой прослушиватель на порту 8787 с suspend=n . Мы можем переопределить порт, указав его после аргумента –debug .

Для большего контроля над аргументом отладки мы можем просто добавить полные аргументы отладки в переменную среды JAVA_OPTS .

4.3. Веблогик

Сценарий запуска для Weblogic — startWeblogic.sh . Чтобы запустить сервер Weblogic с включенной отладкой, мы можем установить для переменной среды debugFlag значение true .

Режим отладки по умолчанию использует сетевой прослушиватель на порту 8453 с suspend=n . Мы можем переопределить порт, установив переменную среды DEBUG_PORT .

Для большего контроля над аргументом отладки мы можем просто добавить полные аргументы отладки в переменную среды JAVA_OPTIONS .

Последние версии Weblogic также предоставляют подключаемый модуль Maven для запуска и остановки серверов. Этот подключаемый модуль будет учитывать те же переменные среды, что и сценарий запуска .

4.4. Стеклянная рыба

Сценарий запуска для Glassfish — asadmin . Чтобы запустить сервер Glassfish с включенной отладкой, мы должны использовать --debug :

asadmin start-domain --debug

Режим отладки по умолчанию использует сетевой прослушиватель на порту 9009 с suspend=n .

4.5. пристань

Сервер приложений Jetty не поставляется со сценарием запуска. Вместо этого серверы Jetty запускаются с помощью команды java .

Таким образом, включить отладку так же просто, как добавить стандартные аргументы командной строки JVM.

5. Отладка из IDE

Теперь, когда мы увидели, как включить отладку в различных типах приложений, давайте рассмотрим подключение отладчика.

Каждая современная IDE предлагает поддержку отладки. Это включает в себя как возможность запуска нового процесса с включенной отладкой, так и возможность отлаживать уже запущенный процесс.

5.1. IntelliJ

IntelliJ предлагает первоклассную поддержку приложений Spring и Spring Boot. Для отладки достаточно просто перейти к классу с помощью основного метода, щелкнуть правой кнопкой мыши значок треугольника и выбрать «Отладка».

./cb3d8c8df20afd9a6ea89f5f75d042ca.jpg

Если проект содержит несколько приложений Spring Boot, IntelliJ предоставит окно инструмента Run Dashboard. Это окно позволяет нам отлаживать несколько приложений Spring Boot из одного места:

./47d42fd37f6336f80329a8f8a2adb3f2.jpg

Для приложений, использующих Tomcat или другие веб-серверы, мы можем создать пользовательскую конфигурацию для отладки. В разделе « Выполнить» > « Редактировать конфигурации » есть ряд шаблонов для наиболее популярных серверов приложений:

./aee3378a840568675cc73b89244d8da4.jpg

Наконец, IntelliJ упрощает подключение к любому запущенному процессу и его отладку. Пока приложение было запущено с правильными аргументами отладки , IntelliJ может подключиться к нему, даже если оно находится на другом хосте.

На экране Run/Debug Configurations удаленный шаблон позволит нам настроить способ подключения к уже запущенному приложению:

./b64b3bbe7fb655eb5a54b10ebdda3969.jpg

Обратите внимание, что IntelliJ нужно знать только имя хоста и порт отладки. Для удобства он сообщает нам правильные аргументы командной строки JVM, которые следует использовать в приложении, которое мы хотим отлаживать.

5.2. Затмение

Самый быстрый способ отладки приложения Spring Boot в Eclipse — щелкнуть правой кнопкой мыши основной метод в окнах Package Explorer или Outline :

./0abe43149a1bb25ef0cfee904e0e146e.jpg

Установка Eclipse по умолчанию не поддерживает Spring или Spring Boot из коробки. Однако в Eclipse Marketplace доступно дополнение Spring Tools , которое обеспечивает поддержку Spring, сравнимую с IntelliJ.

В частности , надстройка предоставляет панель управления загрузкой, которая позволяет нам управлять несколькими приложениями Spring Boot из одного места :

./48e4a4e83d48907a1ad6b2ceeaaa5428.jpg

Надстройка также предоставляет конфигурацию запуска/отладки Spring Boot , которая позволяет настраивать отладку отдельного приложения Spring Boot. Этот настраиваемый вид доступен из тех же мест, что и стандартная конфигурация Java-приложения .

Для отладки уже запущенного процесса локально или на удаленном хосте мы можем использовать конфигурацию удаленного Java-приложения :

./dcdc620304171b5252a131b3ba7bccbc.jpg

6. Отладка с помощью Docker

Для отладки приложения Spring внутри контейнера Docker может потребоваться дополнительная настройка. Если контейнер работает локально и не использует сетевой режим хоста , то порт отладки будет недоступен за пределами контейнера.

Есть несколько способов открыть порт отладки в Docker.

Мы можем использовать –expose с командой запуска docker :

docker run --expose 8000 mydockerimage

Мы также можем добавить директиву EXPOSE в Dockerfile :

EXPOSE 8000

Или, если мы используем Docker Compose, мы можем добавить его в YAML:

expose:
- "8000"

7. Заключение

В этой статье мы увидели, как включить отладку для любого приложения Java.

Просто добавив один аргумент командной строки, мы можем легко отлаживать любое Java-приложение.

Мы также увидели, что и Maven, и Gradle, а также большинство популярных IDE имеют специализированные надстройки, которые еще больше упрощают отладку приложений Spring и Spring Boot.