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、解决过程
- 通过Run with --stacktrace 查看详细的异常堆栈信息,但是看到底没有看到有用的信息。
- 因为gradle同步时未报错,理论上应该不是构建版本的问题,谨慎起见还是通过kapt 使用其他注解处理器,发现可以正常编,说明问题并不是出在构建环境上面,而是modlue中的注解处理存在问题。
- 结合上一条验证结论,如果注解处理器本身存在问题,理论上编译器编译时会直接报出来对应的异常,可以明显的观察到是注解处理器的异常,而本次未明显观察到,可能并不是注解处理器处理时(自身逻辑)出现的异常。
- 打开module中的注解处理器代码,看起来很正常,因此将注解处理器核心处理代码进行分块注释,通过排除法,缩小异常代码范围。
- 最终范围缩小到了生成类保存的代码块,但是看起来依然很正常,反复观察发现有一行代码使用了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级别的打印在什么情况下会导致编译失败,对我来说也算是一个迷,如果有知晓的小伙伴还望不吝赐教,至此本次异常问题解决结束。