You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块Maven项目中Sonar代码覆盖率始终为0问题求助

嘿,我来帮你搞定这个Sonar代码覆盖率始终为0的问题!结合你的多模块Maven项目结构(Parent/Client/Server/End2End),大概率是测试报告没被Sonar正确识别或者模块间的测试关联配置没做好,下面是一步步的排查和解决方法:

一、先确认测试报告是否正常生成

Sonar依赖测试覆盖率报告(常用JaCoCo)来统计覆盖率,所以第一步要确保报告能生成:

  • 检查父POM是否引入JaCoCo插件,如果没有,在父POM的<build><plugins>节点添加:
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.11</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>
  • 执行mvn clean test,然后去每个模块的target/site/jacoco目录下查看是否有index.html文件。如果没有,说明测试没执行或者JaCoCo没生成报告,先解决这个基础问题。
二、多模块Sonar的核心配置要点

多模块项目需要明确告诉Sonar每个模块的报告位置,尤其是End2End测试模块的关联配置:

  • 补充父POM里的Sonar相关properties(结合你已有的配置完善):
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <!-- 告诉Sonar复用已生成的JaCoCo报告,避免重复执行测试 -->
    <sonar.jacoco.reportPaths>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPaths>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.host.url>http://your-sonar-server-address</sonar.host.url> <!-- 替换为你的Sonar服务地址 -->
</properties>
  • 针对End2End模块的特殊配置:因为它的测试是跨模块的,需要在End2End模块的POM里指定测试覆盖的目标模块,并正确关联报告:
<properties>
    <sonar.jacoco.reportPaths>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPaths>
    <sonar.coverage.exclusions>**/test/**</sonar.coverage.exclusions>
    <sonar.test.inclusions>**/end2end/**</sonar.test.inclusions>
</properties>
三、避开这些常见的坑
  • 不要跳过测试阶段:执行Sonar分析时,必须先完成测试和报告生成,推荐命令:mvn clean verify sonar:sonar,不要直接跑mvn sonar:sonar,否则Sonar找不到报告。
  • 检查Sonar界面配置:登录SonarQube,进入你的项目,在「项目设置」→「覆盖率」里确认已启用JaCoCo,且报告路径配置正确。
  • Client模块的UI测试适配:Swing应用的UI测试(比如用AssertJ Swing)要确保被JaCoCo捕获,JaCoCo插件的prepare-agent目标已经自动添加了agent参数,只要正常执行mvn test就没问题。
  • 合理排除无关代码:如果有些代码不需要统计(比如Server模块的Spring Boot启动类),可以在properties里添加:<sonar.coverage.exclusions>**/Application.java</sonar.coverage.exclusions>,但不要过度排除,避免影响真实覆盖率。
四、验证步骤
  1. 执行mvn clean verify,确保所有模块测试通过,且每个模块target目录下存在jacoco.exec和site/jacoco报告。
  2. 执行mvn sonar:sonar,等待分析完成。
  3. 打开SonarQube界面查看覆盖率,如果还是0,去「后台任务」里查看日志,通常能找到报告找不到、路径错误之类的具体问题。

内容的提问来源于stack exchange,提问作者Alex Foglia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:53:05