Debugging Spring Applications

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

1. Вступление

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

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

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

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

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

By default, the JVM does not enable debugging. Это связано с тем, что отладка создает дополнительные издержки внутри JVM. Это также может быть проблемой безопасности для приложений, которые являются общедоступными.

Следовательно,debugging should only be performed during development и никогда в производственных системах.

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

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

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

-agentlib: jdwp

Включите агент Java Debug Wire Protocol (JDWP) внутри JVM. This is the main command line argument that enables debugging.с

транспорт = dt_socket

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

server = y

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

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

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

адрес = 8000

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

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

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

Приложения Spring Bootcan be started several ways. Самый простой способ - из командной строки с помощью командыjava с параметром-jar.

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

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

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

mvn spring-boot:run -Dagentlib: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 стал очень популярным в последние годы, традиционныеapplication serversвсе еще довольно распространены в современных архитектурах программного обеспечения. В этом разделе мы рассмотрим, как включить отладку для некоторых из наиболее популярных серверов приложений.

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

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

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

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

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

В последних версиях Weblogic также имеется плагин Maven для запуска и остановки серверов. This plugin will honor the same environment variables as the startup script.

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. Отладка так же проста, как переход к классу с помощью методаmain, щелчок правой кнопкой мыши по значку треугольника и выбор «Отладка».

image

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

image

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

image

Наконец, IntelliJ позволяет очень легко подключаться к любому запущенному процессу и отлаживать его. As long as the application was started with the proper debug arguments, IntelliJ может подключиться к нему, даже если он находится на другом хосте.

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

image

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

5.2. Затмение

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

image

Стандартная установка Eclipse не поддерживает Spring или Spring Boot из коробки. Однако в Eclipse Marketplace доступенSpring Tools add-on, который обеспечивает поддержку Spring, сопоставимую с IntelliJ.

В частности,the add-on provides a Boot Dashboard that lets us manage multiple Spring Boot applications from a single place:

image

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

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

image

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

ОтладкаSpring application inside a Docker container может потребовать дополнительной настройки. If the container is running locally and is not using host network mode, то порт отладки не будет доступен за пределами контейнера.

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

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

docker run --expose 8000 mydockerimage

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

EXPOSE 8000

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

expose:
 - "8000"

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

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

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

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