【问题标题】:Cannot get sonar to process jacoco exec files for a multi-module maven project无法让声纳处理多模块 Maven 项目的 jacoco exec 文件
【发布时间】:2015-10-04 03:28:01
【问题描述】:

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

项目结构类似如下:

  • 项目
    • 父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 clean install 时,我可以看到为每个模块创建了一个 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,但得到了相同的结果。

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

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

据此,我修改了我的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 clean install 时,我只看到一个 jacoco.exec 文件:

$ find . -name '*.exec'
./code-coverage/target/jacoco.exec

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

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

我是否需要以某种方式修改maven-surefire-plugin

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

【问题讨论】:

    标签: maven sonarqube jacoco


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 2015-12-25
      • 2013-03-21
      • 1970-01-01
      • 2021-02-23
      • 2019-02-13
      • 2017-05-09
      • 2015-09-28
      • 2020-12-11
      相关资源
      最近更新 更多