使用kapt和gradle

时间:2017-05-22 17:14:13

标签: kotlin remote-debugging annotation-processing annotation-processor kapt

我正在建立一个注释处理器,我最近使用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

4 个答案:

答案 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。