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. Для отладки достаточно просто перейти к классу с помощью основного
метода, щелкнуть правой кнопкой мыши значок треугольника и выбрать «Отладка».
Если проект содержит несколько приложений Spring Boot, IntelliJ предоставит окно инструмента Run Dashboard. Это окно позволяет нам отлаживать несколько приложений Spring Boot из одного места:
Для приложений, использующих Tomcat или другие веб-серверы, мы можем создать пользовательскую конфигурацию для отладки. В разделе « Выполнить»
> « Редактировать конфигурации
» есть ряд шаблонов для наиболее популярных серверов приложений:
Наконец, IntelliJ упрощает подключение к любому запущенному процессу и его отладку. Пока приложение было запущено с правильными аргументами отладки , IntelliJ может подключиться к нему, даже если оно находится на другом хосте.
На экране Run/Debug Configurations
удаленный
шаблон позволит нам настроить способ подключения к уже запущенному приложению:
Обратите внимание, что IntelliJ нужно знать только имя хоста и порт отладки. Для удобства он сообщает нам правильные аргументы командной строки JVM, которые следует использовать в приложении, которое мы хотим отлаживать.
5.2. Затмение
Самый быстрый способ отладки приложения Spring Boot в Eclipse — щелкнуть правой кнопкой мыши основной метод в окнах Package Explorer
или Outline :
Установка Eclipse по умолчанию не поддерживает Spring или Spring Boot из коробки. Однако в Eclipse Marketplace доступно дополнение Spring Tools , которое обеспечивает поддержку Spring, сравнимую с IntelliJ.
В частности , надстройка предоставляет панель управления загрузкой, которая позволяет нам управлять несколькими приложениями Spring Boot из одного места :
Надстройка также предоставляет конфигурацию запуска/отладки Spring Boot
, которая позволяет настраивать отладку отдельного приложения Spring Boot. Этот настраиваемый вид доступен из тех же мест, что и стандартная конфигурация Java-приложения .
Для отладки уже запущенного процесса локально или на удаленном хосте мы можем использовать конфигурацию удаленного Java-приложения
:
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.