Автор оригинала: 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 еще проще.