Jacoco 0.8.7覆盖率数据无效 导入Sonarqube报行号超范围错误
报错根因
该错误是因为Jacoco生成覆盖率报告时对应的源文件版本,与Sonarqube扫描时读取的本地源文件版本不一致:Jacoco报告中记录了类的第88行有覆盖率数据,但Sonarqube读取到的当前源文件实际只有87行,行号匹配失败导致导入报错。
解决方案
- 第一步清空所有历史构建产物:删除编译生成的
class文件、Jacoco覆盖率临时统计文件(.exec后缀)、旧的XML格式覆盖率报告,避免历史缓存数据干扰 - 第二步基于最新源代码重新全量执行流水线:先做代码编译、Jacoco字节码打桩,再执行单元测试生成覆盖率统计数据,最后生成新的XML覆盖率报告
- 第三步确保Sonarqube扫描前没有修改任何源文件,直接使用刚生成的最新覆盖率报告执行扫描
- 如果是Kotlin项目,确认版本兼容性:Jacoco 0.8.7最低支持Kotlin 1.5版本,若项目Kotlin版本低于1.5,可升级Jacoco到最新稳定版,或调整Kotlin版本到兼容范围
- 若项目开启了代码混淆、字节码增强逻辑,需要在对应配置中保留行号映射:比如ProGuard配置中添加
-keepattributes LineNumberTable参数,避免字节码行号和源文件行号不匹配
验证方式
你可以手动打开Jacoco生成的XML报告,找到对应类的<sourcefile>标签,查看内部记录的行号最大值,和本地对应源文件的实际行数做对比,确认二者是否匹配。
内容的提问来源于stack exchange,提问作者Prasa Dev
相关产品推荐
相关产品推荐

