我正在建立一个注释处理器,我最近使用kotlin-kapt插件从使用默认的annotationProcessor类型转换为kapt。
我正在使用命令
调试我的处理器./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac
(完整说明:https://stackoverflow.com/a/42488641/502463)
然后运行远程调试配置。当我使用annotationProcessor时,我可以点击断点,并进行调试。使用kapt,我的处理器运行,但我无法调试它。没有触发断点。
我的kotlin版本是1.1.2-3
答案 0 :(得分:9)
您实际上想要调试Kotlin编译器守护程序,而不是Gradle守护程序。以下是传递所需JVM参数的方法:
I have made this in jsfiddle. Is this what you are looking for?
答案 1 :(得分:2)
另一个答案通常是正确的,但我发现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并对调试器按钮进行混搭,我很幸运能够以这种方式附加它。
答案 2 :(得分:1)
我刚刚尝试调试Kotlin注释处理器,并找到了这篇文章。 您可以通过传递suspend = y
来告诉JVM等待调试器我现在要做的是从命令行开始构建:
./gradlew --no-daemon clean build -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=y"
,然后通过远程配置与Intellij附加。
答案 3 :(得分:1)
从Kotlin 1.2.60开始,kat通过在gradle.properties文件中包含kapt.use.worker.api=true
来支持使用Gradle Worker API。
额外的副作用是,可以使用常规gradle调试参数(./gradlew <task> -Dorg.gradle.debug=true --no-daemon
)调试kapt任务,不需要特定的kotlin args。