Рубрики
Без рубрики

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

Узнайте, как отлаживать приложения Spring для различных серверов приложений и IDE

Автор оригинала: Michael Pratt.

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 и общую память.

сервер=и

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

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

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

адрес=8000

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

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

3. Приложения для весенней загрузки

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

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

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

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 с включенной отладкой, мы можем установить переменную среды debug Flag в true .

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

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

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

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

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

asadmin start-domain --debug

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

4.5. Причал

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

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

5. Отладка от ИДЕИ

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

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

5.1. IntelliJ

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

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

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

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

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

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

5.2. Затмение

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

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

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

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

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

6. Отладка С Помощью Docker

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

Существует несколько способов открыть порт отладки в 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 еще проще.