SonarQube+Jacoco问题:Sonar无法读取配置的覆盖率报告路径
我之前帮朋友排查过类似的多模块项目覆盖率问题,结合Sonar Scanner 3.1和Java 1.7的环境,给你几个实用的排查和解决方向:
1. 先确认版本兼容性问题
Sonar Scanner 3.1对应的SonarQube版本一般是7.x系列,而Java 1.7对Jacoco的版本有严格要求——Jacoco从0.8.1开始就要求Java 1.8及以上了。如果你用了高于0.7.9的Jacoco版本,生成的test.exec文件可能在Java 1.7环境下无法被Sonar解析。建议把Jacoco版本降到0.7.9,再重新生成覆盖率报告试试。
2. 调整多模块项目的路径配置
多模块项目里,sonar.jacoco.reportPaths的路径是相对于每个模块的根目录,而不是项目根目录的全局路径。比如你的项目结构是:
项目根目录/ ├── 模块A/ │ └── build/jacoco/test.exec ├── 模块B/ │ └── build/jacoco/test.exec
那你在项目根目录的sonar.properties里只需要配置:
sonar.jacoco.reportPaths=build/jacoco/test.exec
然后从项目根目录运行Sonar Scanner,每个模块会自动去自己的build/jacoco目录找test.exec。旧版本的Sonar Scanner对**/这种递归路径的支持不太稳定,别用全局通配符,反而容易出问题。
如果还是不行,你也可以在执行扫描时用命令行参数强制指定:
sonar-scanner -Dsonar.jacoco.reportPaths=build/jacoco/test.exec
3. 确认test.exec文件本身没问题
先手动检查每个模块的build/jacoco/test.exec:
- 有没有生成?会不会是测试没运行,或者Jacoco插件配置错了导致报告为空?
- 文件大小是不是非零?空文件Sonar肯定读不到。
- Sonar Scanner运行的用户有没有读取这个文件的权限?比如CI环境里可能有权限限制,导致文件无法被访问。
如果是Maven项目,先手动跑mvn clean test jacoco:report,确保test.exec正常生成后再扫Sonar。
4. 检查SonarQube服务器的Jacoco插件版本
确保SonarQube服务器上安装的Jacoco插件和Scanner 3.1兼容,比如SonarQube 7.9对应的Jacoco插件版本是1.0.2左右,太新的插件可能不支持旧版Scanner。如果插件版本不匹配,也会出现读不到报告的情况。
5. 配置Jacoco的agent确保数据收集正确
有时候覆盖率数据没被正确收集,也会导致Sonar读不到有效内容。如果是Maven项目,可以在模块的pom.xml里配置Jacoco插件,强制在测试阶段收集覆盖率:
<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.9</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
按这些步骤排查下来,大部分情况下都能解决Sonar读不到Jacoco报告的问题。
内容的提问来源于stack exchange,提问作者Lobo

