配置包排除规则后SonarQube代码覆盖率仍显示0%问题咨询
问题原因
- 通配符匹配范围不足:你原有配置中的
**/model/*.java只能匹配model包下直接存放的Java文件,若model包下存在子包,子包内的文件无法被匹配到 - Jacoco未同步配置排除规则:SonarQube的覆盖率数据默认读取Jacoco生成的报告,你仅配置了Sonar端的排除,但Jacoco统计覆盖率时仍将model包纳入计算,生成的报告本身就包含model包0覆盖率的数据,Sonar扫描时会直接读取这部分数据
- 配置项用途混淆:
sonar.exclusions是将目标文件从所有Sonar分析(包括静态代码检查、漏洞扫描、覆盖率统计等)中完全排除,若你仅需要排除覆盖率统计,使用sonar.coverage.exclusions即可,不需要配置前者
配置依赖说明
sonar.exclusions/sonar.coverage.exclusions都是Sonar扫描器的原生配置参数,不需要额外引入任何Sonar相关依赖,只要执行mvn sonar:sonar命令触发扫描就能生效。
解决配置方案
方式1:在Maven pom中配置(推荐,随代码版本管理)
- 修正properties中的Sonar覆盖率排除规则
<properties> <!-- 仅排除model包的覆盖率统计,不影响其他静态检查 --> <sonar.coverage.exclusions>**/model/**/*.java</sonar.coverage.exclusions> </properties>
- 同步修改Jacoco插件的排除配置
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.6</version> <configuration> <excludes> <!-- Jacoco匹配的是编译后的class文件路径,匹配model下所有类包括子包 --> <exclude>**/model/**/*.class</exclude> </excludes> </configuration> <!-- 原有executions逻辑保持不变 --> <executions> <execution> <id>pre-unit-test</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>target/coverage-data/jacoco-ut.exec</destFile> <propertyName>surefireArgLine</propertyName> </configuration> </execution> <execution> <id>post-unit-test</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>target/coverage-data/jacoco-ut.exec</dataFile> <outputDirectory>target/coverage-reports/jacoco-ut</outputDirectory> </configuration> </execution> </executions> </plugin>
配置完成后执行mvn clean install sonar:sonar重新构建扫描即可生效。
方式2:在SonarQube后台配置
不需要修改代码,直接进入对应Sonar项目的后台管理页,依次进入「配置」-「分析范围」-「覆盖率排除」,添加规则**/model/**/*.java保存后,后续扫描自动生效。
内容的提问来源于stack exchange,提问作者user15006167
相关产品推荐
相关产品推荐

