关于kotlin中使用apt的一次异常问题排查

本文描述了一名开发者在使用Kotlin和Kapt时遇到的编译失败问题,经过排查发现是由于注解处理器中的Messager进行ERROR级别打印导致。作者分享了解决过程和初步结论,但仍未找到ERROR级别打印导致编译失败的具体原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、异常信息

FAILURE: Build completed with 2 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
   > java.lang.reflect.InvocationTargetException (no error message)

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:kaptReleaseKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
   > java.lang.reflect.InvocationTargetException (no error message)

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
==============================================================================

2、异常场景

  • 开发语言kotlin。
  • 采用kapt使用外部module中的注解处理器。
  • 非gradle同步时报错,只有编译时才会出,出现后编译异常终止。

3、解决过程

  1. 通过Run with --stacktrace 查看详细的异常堆栈信息,但是看到底没有看到有用的信息。
  2. 因为gradle同步时未报错,理论上应该不是构建版本的问题,谨慎起见还是通过kapt 使用其他注解处理器,发现可以正常编,说明问题并不是出在构建环境上面,而是modlue中的注解处理存在问题。
  3. 结合上一条验证结论,如果注解处理器本身存在问题,理论上编译器编译时会直接报出来对应的异常,可以明显的观察到是注解处理器的异常,而本次未明显观察到,可能并不是注解处理器处理时(自身逻辑)出现的异常。
  4. 打开module中的注解处理器代码,看起来很正常,因此将注解处理器核心处理代码进行分块注释,通过排除法,缩小异常代码范围。
  5. 最终范围缩小到了生成类保存的代码块,但是看起来依然很正常,反复观察发现有一行代码使用了javax.annotation.processing.Messager进行了ERROR级别的打印
    messager.printMessage(Diagnostic.Kind.ERROR, "save class begin~");既然怀疑这里,那么注释掉再次尝试后编译通过,未见异常。

4、解决结论

javax.annotation.processing.Messager ERROR级别打印导致本次编译异常的出现

但是有意思的一点是该注解处理器并不是第一次使用,之前项目中也在用,同样的构建环境(gradle、kotlin、java、jdk版本一致)没有出现过该问题,而Messager网上资料并不多,也看到有人说可以用来打印注解处理器处理过程中的信息,但是通过本次异常看Messager的打印(至少ERROR)不能随便使用,否则可能会造成编译失败。

5、最后

通过查找资料,最终也没有定位到Messager ERROR级别的打印在什么情况下会导致编译失败,对我来说也算是一个迷,如果有知晓的小伙伴还望不吝赐教,至此本次异常问题解决结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值