使用 kapt 和 gradle 时无法调试注释处理器

Can't Debug an Annotation Processor when using kapt and gradle

我正在构建一个注释处理器,最近我使用 kotlin-kapt 插件从使用默认的 annotationProcessor 类型切换到 kapt。

我正在使用命令调试我的处理器

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

(完整说明在这里:)

然后运行一个远程调试配置。当我使用 annotationProcessor 时,我可以命中断点,并且可以正常调试。使用 kapt,我的处理器可以运行,但我无法调试它。没有断点被触发。

我的kotlin版本是1.1.2-3

您实际上想要调试 Kotlin 编译器守护程序,而不是 Gradle 守护程序。以下是传递所需 JVM 参数的方法:

./gradlew <tasks> -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"

其他答案大体上是正确的,但我发现 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 并捣碎调试器按钮,我很幸运地以这种方式附加它。

我刚刚尝试调试 Kotlin 注释处理器并发现了这个 post。 您可以通过传递 suspend=y

告诉 JVM 等待调试器

我现在所做的是从命令行开始构建:

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

然后通过远程配置与 Intellij 连接。

从 Kotlin 1.2.60 开始,kapt 通过在 gradle.properties 文件中包含 kapt.use.worker.api=true 来支持使用 Gradle Worker API。

额外的副作用是可以使用正常的 gradle 调试参数 (./gradlew <task> -Dorg.gradle.debug=true --no-daemon) 调试 kapt 任务,并且不需要特定的 kotlin 参数。