gpt4 book ai didi

maven - 无法让 Sonar 处理多模块 Maven 项目的 jacoco exec 文件

转载 作者:行者123 更新时间:2023-12-04 15:56:20 32 4
gpt4 key购买 nike

我正在尝试为多模块 Maven 项目的 Sonar 生成单元测试代码覆盖率数据,但没有得到正确的结果。

项目结构类似于以下:

  • 项目
  • 父Pom
  • 模块A
  • 模块B
  • 模块 B1
  • 模块 B2
  • 模块 C

  • 我正在使用 jacoco maven 插件生成 jacoco.exec文件,以及用于分析代码的 Sonar maven 插件(包括 jacoco.exec 文件)。

    这些文件是在 process-tests 期间生成的。阶段,如下:
    <properties>
    <jacoco.report.path>${project.build.directory}/jacoco.exec</jacoco.report.path>
    <sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath>
    </properties>

    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.4.201502262128</version>
    <executions>
    <execution>
    <id>default-prepare-agent</id>
    <phase>process-test-classes</phase>
    <goals>
    <goal>prepare-agent</goal>
    </goals>
    <configuration>
    <destFile>${jacoco.report.path}</destFile>
    </configuration>
    </execution>
    </executions>
    </plugin>

    当我运行 mvn 全新安装 我可以看到有一个 jacoco.exec为每个模块创建的文件:
    $ find . -name '*.exec'
    ./moduleA/target/jacoco.exec
    ./moduleB/moduleB1/target/jacoco.exec
    ./moduleB/moduleB2/target/jacoco.exec
    ./moduleC/target/jacoco.exec

    当我运行 mvn sonar:sonar 时,我看到 Jacoco 传感器适用于所有模块,但似乎只适用于第一个模块。后续模块显示 Coverage information was not collected :
    [INFO] [17:13:58.333] Sensor JaCoCoSensor
    [INFO] [17:13:58.350] Analysing moduleA\target\jacoco.exec
    [INFO] [17:13:58.374] No information about coverage per test.
    [INFO] [17:13:58.374] Sensor JaCoCoSensor (done) | time=41ms
    ...
    [INFO] [17:14:02.202] Sensor JaCoCoSensor
    [INFO] [17:14:02.261] Analysing moduleB\moduleB1\target\jacoco.exec
    [WARN] [17:14:02.334] Coverage information was not collected. Perhaps you forget to include debug information into compiled classes?
    [INFO] [17:14:02.334] Sensor JaCoCoSensor (done) | time=132ms
    ...

    我不确定为什么在第二个和后续模块中没有覆盖信息,因为 maven-compiler-plugin默认情况下包含调试信息,为了安全起见,我还运行了 mvn clean install -Dmaven.compiler.debug=true但得到了相同的结果。

    因此,当我在 Sonar 服务器中检查项目时,它仅显示第一个模块的代码覆盖率: moduleA .不存在其他模块的代码覆盖率信息。

    显然这里的解决方案是只生成一个 jacoco.exec文件,这样当 jacoco-maven-plugin执行它会将每个模块的结果附加到该文件中,以便 Sonar 可以正确发挥其魔力。

    因此,我修改了我的 parentPom/pom.xml文件如下:
    <properties>
    <!-- single jacoco.exec file relative to root directory of the project -->
    <jacoco.report.path>${session.executionRootDirectory}/code-coverage/jacoco.exec</jacoco.report.path>
    <sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath>
    </properties>

    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.4.201502262128</version>
    <executions>
    <execution>
    <id>default-prepare-agent</id>
    <phase>process-test-classes</phase>
    <goals>
    <goal>prepare-agent</goal>
    </goals>
    <configuration>
    <destFile>${jacoco.report.path}</destFile>
    <append>true</append> <!-- now appending to single jacoco.exec file -->
    </configuration>
    </execution>
    </executions>
    </plugin>

    这意味着在单元测试运行后,将调用 jacaco 代理
    现在当我运行 mvn 全新安装 我只看到一个 jacoco.exec文件:
    $ find . -name '*.exec'
    ./code-coverage/target/jacoco.exec

    但是当我运行 mvn sonar:sonar 时,JaCoCoSensor 似乎没有被调用,并且 Sonar 服务器上的项目根本没有代码覆盖。

    我在这里做错了什么?如何让 Sonar 分析我的 Maven 项目中所有模块的代码覆盖率?

    是否需要修改 maven-surefire-plugin某种程度上来说?

    我正在使用 SonarQube 5.1、JDK 1.8、jacoco-maven-plugin 0.7.4.201502262128

    最佳答案

    JaCoCo 传感器只会加载您在模块中覆盖的类的覆盖范围。

    这意味着如果由于某种原因模块 B 中的 jacoco.exec 不包含有关该模块的 .class 文件的覆盖信息,那么它将不会加载任何覆盖(即使您覆盖了另一个模块中的类)。

    关于maven - 无法让 Sonar 处理多模块 Maven 项目的 jacoco exec 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31424485/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com