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