首页 > Java > java教程 > 正文

解决 SonarQube 中 JaCoCo 代码覆盖率显示为 0% 的问题

碧海醫心
发布: 2025-09-25 12:02:57
原创
596人浏览过

解决 sonarqube 中 jacoco 代码覆盖率显示为 0% 的问题

本文旨在解决 Maven 项目在 SonarQube 中代码覆盖率显示为 0% 的常见问题。核心原因通常是 JaCoCo 和 Surefire 插件配置不一致,导致 JaCoCo 覆盖率数据文件未正确生成或 SonarQube 无法找到生成的 XML 报告。我们将详细指导如何正确配置 pom.xml 和 Jenkins Pipeline,确保 JaCoCo 数据生成、XML 报告输出以及 SonarQube 正确读取。

1. 问题背景与根源分析

当您在 Jenkins Pipeline 中为 Spring Boot 应用执行 JUnit 测试并通过 SonarQube 进行代码质量分析时,可能会遇到 SonarQube 中代码覆盖率始终显示为 0% 的情况。这通常伴随着 JaCoCo 插件在构建日志中发出类似 Skipping JaCoCo execution due to missing execution data file 的警告。

此问题的根本原因在于 JaCoCo Maven 插件、Maven Surefire 插件以及 SonarQube 配置之间存在不一致。具体来说,主要有以下几点:

  • JaCoCo .exec 数据文件未生成或路径错误: JaCoCo 通过在 JVM 启动时注入代理来收集代码覆盖率数据,并将数据写入 .exec 文件。如果 Surefire 插件(负责运行测试)未能正确集成 JaCoCo 代理,或 .exec 文件生成路径与后续报告生成或 SonarQube 查找的路径不符,就会导致数据丢失
  • JaCoCo XML 报告未生成或路径错误: SonarQube 通常需要 JaCoCo 生成的 XML 格式报告来导入覆盖率数据。如果 JaCoCo 报告生成阶段未正确配置,或者生成的 XML 报告路径与 SonarQube 配置中指定的路径不一致,SonarQube 将无法找到并解析覆盖率数据。
  • SonarQube 参数配置不正确: 在 Jenkins Pipeline 中调用 mvn sonar:sonar 命令时,传递给 SonarQube 的 JaCoCo 报告路径参数可能与实际生成的报告路径不匹配,或者使用了错误的参数名称。

为了解决这些问题,我们需要确保 JaCoCo、Surefire 和 SonarQube 之间的配置保持高度一致性。

2. Maven pom.xml 配置详解

pom.xml 是配置 JaCoCo 和 Surefire 插件的关键。以下是推荐的配置方式,确保 JaCoCo 代理正确注入测试 JVM,并生成 SonarQube 可识别的 XML 报告。

2.1 项目属性定义

在 <properties> 块中,定义 JaCoCo .exec 文件和 XML 报告的路径,以及 Surefire 报告的路径。这将有助于保持配置的一致性。

代码小浣熊
代码小浣熊

代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节

代码小浣熊 51
查看详情 代码小浣熊
<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- JaCoCo .exec 文件路径,用于存储运行时覆盖率数据 -->
    <jacoco.exec.file>${project.build.directory}/jacoco.exec</jacoco.exec.file>
    <!-- JaCoCo XML 报告输出目录 -->
    <jacoco.report.dir>${project.build.directory}/jacoco_report</jacoco.report.dir>

    <!-- SonarQube 相关的报告路径配置 -->
    <sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath>
    <sonar.coverage.jacoco.xmlReportPaths>${jacoco.report.dir}/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
</properties>
登录后复制

2.2 Maven Surefire 插件配置

Surefire 插件负责运行单元测试。它需要使用 JaCoCo 代理来收集覆盖率数据。这通过 <argLine> 配置实现,该配置会从 JaCoCo 的 prepare-agent 目标中获取 JVM 参数。

<build>
    <plugins>
        <!-- Maven Surefire Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version> <!-- 建议使用较新且稳定的版本 -->
            <configuration>
                <!-- 关键:使用 JaCoCo prepare-agent 目标设置的 JVM 参数 -->
                <argLine>${surefireArgLine}</argLine>
                <!-- Surefire 报告输出目录 -->
                <reportsDirectory>${sonar.surefire.reportsPath}</reportsDirectory>
            </configuration>
        </plugin>
        <!-- ... 其他插件 ... -->
    </plugins>
</build>
登录后复制

2.3 JaCoCo Maven 插件配置

JaCoCo 插件有两个主要目标需要配置:prepare-agent 和 report。

  • prepare-agent:在测试运行之前准备 JaCoCo 代理,并将其配置为 Surefire 插件的 <argLine>。
  • report:在测试运行之后,根据 .exec 文件生成可供 SonarQube 使用的 XML 格式报告。
<build>
    <plugins>
        <!-- ... Surefire 插件配置 ... -->

        <!-- JaCoCo Maven Plugin -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.6</version> <!-- 确保版本与 SonarQube 兼容,或使用最新稳定版 -->
            <executions>
                <!-- 1. prepare-agent 目标:在测试运行前准备 JaCoCo 代理 -->
                <execution>
                    <id>prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <!-- 指定 .exec 文件的生成路径 -->
                        <destFile>${jacoco.exec.file}</destFile>
                        <!-- 定义一个属性,用于 Surefire 插件的 argLine -->
                        <propertyName>surefireArgLine</propertyName>
                    </configuration>
                </execution>
                <!-- 2. report 目标:在测试运行后生成 XML 报告 -->
                <execution>
                    <id>report</id>
                    <phase>post-unit-test</phase> <!-- 确保在单元测试完成后执行 -->
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <!-- 指定输入 .exec 文件,即 prepare-agent 生成的文件 -->
                        <dataFile>${jacoco.exec.file}</dataFile>
                        <!-- 指定 XML 报告的输出目录 -->
                        <outputDirectory>${jacoco.report.dir}</outputDirectory>
                        <!-- 明确指定生成 XML 格式报告 -->
                        <formats>
                            <format>XML</format>
                        </formats>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
登录后复制

3. Jenkins Pipeline 配置示例

在 Jenkins Pipeline 中,您需要执行 Maven 命令来构建、测试并触发 SonarQube 分析。关键在于确保 mvn sonar:sonar 命令能够正确地找到 JaCoCo 生成的 XML 报告。

pipeline {
    agent any
    stages {
        stage('Build and Test') {
            steps {
                script {
                    // 清理、编译、运行测试并生成 JaCoCo .exec 数据和 XML 报告。
                    // 'verify' 阶段会包含 'test' 阶段和 'post-unit-test' 阶段(JaCoCo report 目标绑定在此)。
                    // 确保所有测试都运行,并且 JaCoCo 报告被生成。
                    sh 'mvn clean verify'
                }
            }
        }
        stage('SonarQube Analysis') {
            steps {
                script {
                    // 确保此处的报告路径与 pom.xml 中 JaCoCo 插件实际生成 XML 报告的路径一致。
                    // 对应 pom.xml 中 <sonar.coverage.jacoco.xmlReportPaths> 的值
                    def jacocoXmlReportPath = "target/jacoco_report/jacoco.xml"

                    sh "mvn sonar:sonar " +
                       "-Dsonar.projectKey=your_project_key " + // 替换为您的 SonarQube 项目 Key
                       "-Dsonar.sources=src/main/java " +
                       "-Dsonar.java.binaries=target/classes " + // 明确指定 Java 字节码目录
                       "-Dsonar.host.url=http://192.168.2.2:9000/ " + // 您的 SonarQube 服务器地址
                       "-Dsonar.login=admin " + // SonarQube 认证令牌或用户名
                       "-Dsonar.password=sonar " + // SonarQube 认证密码 (生产环境建议使用令牌)
                       "-Dsonar.coverage.jacoco.xmlReportPaths=${jacocoXmlReportPath}" // 关键:指定 JaCoCo XML 报告路径
                }
            }
        }
    }
}
登录后复制

以上就是解决 SonarQube 中 JaCoCo 代码覆盖率显示为 0% 的问题的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号