Не удается отладить обработчик аннотаций при использовании kapt и gradle

Я создаю процессор аннотаций, и недавно я перешел с использования типа annotationProcessor по умолчанию на kapt, используя плагин kotlin-kapt.

Я отлаживал свой процессор с помощью команды

./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac

(полные инструкции здесь: https://stackoverflow.com/a/42488641/502463)

А затем запустите конфигурацию удаленной отладки. Когда я использовал annotationProcessor, я мог достигать точек останова и нормально отлаживать. с kapt мой процессор работает, но я не могу его отладить. Точки останова не запускаются.

Моя версия котлина - 1.1.2-3


person Dapp    schedule 22.05.2017    source источник


Ответы (4)


На самом деле вы хотите отлаживать демон компилятора Kotlin, а не демон Gradle. Вот как можно передать необходимые аргументы JVM:

./gradlew <tasks> -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"
person yanex    schedule 22.05.2017
comment
мне нужно также внести изменения в удаленную конфигурацию? - person Dapp; 22.05.2017
comment
Я пробовал: ./gradlew --no-daemon -Dorg.gradle.debug = true: app: clean: app: compileDebugKotlin -Dkotlin.daemon.jvm.options = -Xdebug, -Xrunjdwp: transport = dt_socket \, address = 5005 \, server = y \, suspend = n Без изменений в IDE, но не повезло ... - person Dapp; 22.05.2017
comment
Пожалуйста, перезапустите демоны Kotlin и Gradle. Вы можете найти все выполняемые Java-процессы с помощью команды jps. Также убедитесь, что порт отладки в параметрах JVM демона и IDEA совпадает (5005). - person yanex; 22.05.2017
comment
Теперь я понимаю ... вам также нужно подождать, чтобы подключить отладчик, пока не запустится демон компилятора kotlin - person Dapp; 22.05.2017
comment
задача kaptDebugKotlin, кажется, продолжает выполняться независимо от того, отлаживаю я ее или нет. Есть ли способ заставить его ждать подключения отладчика? - person Dapp; 30.05.2017
comment
Я также изо всех сил пытался отладить проект, отличный от Android, в IntelliJ Idea. Коллега предположил, что kotlin может запускать собственный демон, который не позволяет подключать конфигурацию отладки в нужное время. Запуск kotlin без демонов устраняет проблему: ./gradlew clean :sample:build --no-daemon -Dorg.gradle.debug=true -Dkotlin.compiler.execution.strategy="in-process" -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n". Запустите это в CLI, затем прикрепите конфигурацию удаленной отладки, когда вам будет удобно, а не во время app:kaptDebugKotlin задачи или чего-то еще. - person Den Drobiazko; 26.12.2017
comment
@DenRimus, ты спас мне день! это должен быть альтернативный ответ, поскольку он охватывает проекты, отличные от Android. - person Juan Saravia; 27.10.2018

Другой ответ в целом правильный, но я нашел https://medium.com/@daptronic/annotation-processing-with-kapt-and-gradle-237793f2be57 полезно для более подробного изучения.

Вы можете запустить что-то вроде этого

./gradlew --no-daemon clean compileDebugKotlin -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"

или если вы хотите запустить определенный модуль

./gradlew --no-daemon :modulename:clean :modulename:compileDebugKotlin -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"

Сложная часть

На самом деле нам нужно дождаться начала задачи компиляции Kotlin, прежде чем мы подключим отладчик, она не останавливается и не ждет, пока вы подключите отладчик, как в случае с java.

Итак, вы хотите отслеживать свою сборку и искать задачу: :app:kaptDebugKotlin И когда вы ее видите, сразу же переходите к своей среде IDE и нажимайте отладку в своей удаленной конфигурации. Если вовремя не прикрепиться, задача просто продолжится. У вас есть несколько секунд, чтобы понять это, но заставить все это работать - это немного гонка.

На это у меня ушло ужасно много времени, чтобы разобраться и приступить к работе. Теперь, как только я запускаю команду, я просто перехожу в среду IDE и нажимаю кнопку отладчика, и мне очень повезло, что я подключил ее таким образом.

person konakid    schedule 24.09.2017
comment
Хммм ... это все еще работает в последней версии Android Studio / Kotlin? Я пытаюсь следовать этому подходу и продолжаю получать: - Невозможно открыть порт отладчика (localhost: 5005): java.net.BindException Адрес уже используется (сбой привязки) Я уже вызвал jps, чтобы проверить все запущенные процессы и насколько я могу судить, никто не работает. - person cmota; 17.07.2019

Я просто попытался отладить обработчик аннотаций Kotlin и нашел этот пост. Вы можете указать JVM дождаться отладчика, передав suspend = y

Сейчас я запускаю сборку из командной строки:

./gradlew --no-daemon clean build -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=y"

а затем подключиться с помощью Intellij через удаленную настройку.

person Max Holtzberg    schedule 15.06.2019

Начиная с Kotlin 1.2.60, kapt поддерживает использование Gradle Worker API, включая kapt.use.worker.api=true в ваш файл gradle.properties.

Дополнительным побочным эффектом является то, что задачу kapt можно отлаживать с помощью обычных аргументов отладки gradle (./gradlew <task> -Dorg.gradle.debug=true --no-daemon), и никаких конкретных аргументов kotlin не требуется.

person David Liu    schedule 19.11.2019