Статьи

Отладка Grails 3, Spring Boot или Gradle с Eclipse

Это небольшая статья для тех, кто является основной IDE — Eclipse для разработки приложений или плагинов Grails 3 — и все еще задается вопросом, как отлаживать их приложения.

Прежде всего, чтобы уточнить: в настоящее время нет отладки «Grails», это только Spring Boot и Gradle с Grails 3. Любой способ отладки таких приложений позволяет отлаживать приложение Grails 3.

По этой теме написано множество SO-сообщений и обращений Google, поэтому я создаю этот пост также в качестве краткого резюме «самого простого решения» для себя и для других.

В нескольких версиях Eclipse плагин Eclipse Buildship поставляется вместе, по крайней мере, в обычном Java-пакете, что позволяет мне многое делать с Gradle, который лежит в основе Grails 3, изнутри IDE. bootRun с выполнением любой задачи Gradle, такой как bootRun в моих приложениях Grails 3, было бы очень полезно, если бы я мог также использовать Buildship для отладки .

Что ж, на момент написания статьи такого еще не было: уже с 2015 года отладка веб-приложения с помощью Buildship включена в план. Вы можете запустить Gradle, но пока не можете отлаживать его.

Итак, простой способ отладки: удаленная возможность отладки Java-приложений Eclipse + Gradle в режиме отладки .

Пробовал со свежим приложением Grails 3.2.7 hello-world. (В MacOS с использованием Oracle JDK 8 с Eclipse Oygen (4.7) — но это менее важно)

Всего 2 шага:

  1. Запустите JVM в режиме отладки с помощью ./gradlew bootRun --debug-jvm
  2. В Eclipse создайте конфигурацию удаленного запуска приложения Java, подключаясь к более ранней JVM

Использование gradle bootRun --no-daemon -Dorg.gradle.debug=true позволило Eclipse подключиться в режиме отладки, но Eclipse не остановился ни на одной из точек останова.

Примером

Примите чистое приложение Grails 3.2.7.

Добавьте строку в BootStrap.groovy и установите для нее BootStrap.groovy останова :


Запустите приложение в режиме отладки с помощью оболочки Gradle (или внешнего Gradle) с параметром --debug-jvm .

01
02
03
04
05
06
07
08
09
10
11
12
localhost:hello-world tvinke$ ./gradlew bootRun --debug-jvm
Starting a Gradle Daemon (subsequent builds will be faster)
:compileJava NO-SOURCE
:compileGroovy
:buildProperties UP-TO-DATE
:processResources
:classes
:findMainClass
:bootRun
objc[12520]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java (0x1041d24c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10429a4e0). One of the two will be used. Which one is undefined.
Listening for transport dt_socket at address: 5005
> Building 85% > :bootRun

В этот момент приложение останавливается , заявляя, что прослушивает порт 5005, и не будет продолжаться (по замыслу), пока не будет подключен отладчик.

Создайте в Eclipse конфигурацию отладки (в разделе « Настройка отладки» добавьте запись удаленного приложения Java ), оставив значение по умолчанию для localhost , но измените порт на 5005.

Подключите Eclipse к ожидающей JVM и начните отладку с помощью кнопки Debug .

Приложение продолжает запуск. И на самом деле останавливается на нашей точке останова .

Будущая поддержка отладки с Eclipse Buildship

Eclipse Oxygen в настоящее время поставляется с версией Buildship 2.0. Когда Buildship получит обновление, которое сделает возможной отладку Gradle из среды IDE ? В билете Bugzilla , который был перенесен в более новую проблему # 249 GitHub , нет планов получения опции «Отладка как…» в Eclipse, как и в обычных приложениях Java.

Как говорит один из разработчиков:

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

Есть ли другие способы в Eclipse?

Некоторые пытались установить Spring IDE Core в Eclipse Mars с сайта обновлений Spring и отлаживать приложение Grails в качестве конфигурации Spring Boot App — но я больше не мог этого делать в Eclipse Oxygen. Отсутствие / отсутствие зависимости останавливает все это.

Конечно, есть и другие способы использования Eclipse (возможно, с использованием других интеграций Gradle), и если вы найдете способ, пожалуйста, дайте мне знать!