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

升级Java 8到11后SonarQube代码覆盖率变为0问题求助

解决Java 11 + Jacoco 0.8.7下Sonar代码覆盖率为0的问题

以下是针对该问题的具体排查和修复步骤:

1. 确认Jacoco与Maven生命周期的执行顺序

确保Jacoco的prepare-agent目标在test阶段前执行,report目标在test阶段后完成。正确的插件执行配置示例:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <executions>
        <!-- 预准备代理,在测试前生成exec数据文件 -->
        <execution>
            <id>jacoco-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <destFile>${project.build.directory}/jacoco.exec</destFile>
            </configuration>
        </execution>
        <!-- 生成Jacoco报告,绑定到test阶段之后 -->
        <execution>
            <id>jacoco-report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${project.build.directory}/jacoco.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

2. 检查Sonar与Jacoco报告的关联配置

SonarQube新版本推荐使用sonar.coverage.jacoco.xmlReportPaths参数指定Jacoco的XML报告路径,替代旧的sonar.jacoco.reportPaths:

  • 命令行方式:执行Sonar扫描时添加参数:
mvn clean test jacoco:report sonar:sonar -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
  • Pom配置方式:在Sonar Maven插件中直接指定路径:
<plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>3.9.1.2184</version> <!-- 适配Java 11的稳定版本 -->
    <configuration>
        <sonar.coverage.jacoco.xmlReportPaths>${project.reporting.outputDirectory}/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
    </configuration>
</plugin>

3. 验证Jacoco报告是否正常生成

手动执行mvn clean test jacoco:report,查看target/site/jacoco目录下是否存在jacoco.xml、index.html等报告文件。如果未生成,需排查:

  • 测试用例是否正常执行:查看target/surefire-reports下的测试报告,确认测试没有全部失败或跳过;
  • 解决VM参数冲突:如果测试阶段的argLine覆盖了Jacoco的代理参数,需合并参数:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M5</version> <!-- 适配Java 11的版本 -->
    <configuration>
        <argLine>${argLine} --add-opens java.base/java.lang=ALL-UNNAMED</argLine> <!-- 保留Jacoco的${argLine}变量,添加Java 11所需参数 -->
    </configuration>
</plugin>

4. 检查Java 11兼容性配置

若项目使用Java模块系统(存在ModuleInfo.java),需为Jacoco代理添加模块访问权限:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <configuration>
        <argLine>--add-opens 你的模块名/你的包路径=org.jacoco.agent</argLine>
    </configuration>
    <!-- 执行配置同上 -->
</plugin>

5. 确认版本一致性

确保pluginManagement中声明的Jacoco版本与build/plugins中实际使用的版本完全一致,避免版本冲突导致的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:53:14