JaCoCo 未根据源文件生成覆盖率报告 - 方法名称不可点击

JaCoCo Not Generating Coverage Reports based on Source File - Method names not clickable

我有一个 Maven 多模块项目,其中 JaCoCo 未根据源文件生成报告。

一般来说,如果 MyService 是被测的 class,它会以两种方式报告,一种是通过文件名 MyService.html 在适当的基于包的位置,其中包含一个列表方法以数字和图表的形式给出覆盖率的总体情况 - 列出了 class 中的所有方法,每个方法都有一个可点击的 link 到另一个 html MyService.java.html包含带有 red/green/yellow 背景的源代码以显示覆盖率状态。

在我的场景中,只生成了 MyService.html 而不是 MyService.java.html 和方法在前者中列出了覆盖细节,但没有 hyperlinks 到另一个报告显示如下。

这里的问题变得更有趣了,我的 Maven 配置没有在这个模块中配置,但是在父模块和其他子模块中能够正确生成报告。下面是maven插件配置供参考

父 POM:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
  <configuration>
     <destFile>${project.basedir}/target/jacoco-unit.exec</destFile>
     <dataFile>${project.basedir}/target/jacoco-unit.exec</dataFile>
     <append>true</append>
  </configuration>
  <executions>
     <execution>
        <id>jacoco-initialize</id>
        <goals>
           <goal>prepare-agent</goal>
        </goals>
     </execution>
     <execution>
        <id>jacoco-site</id>
        <phase>package</phase>
        <goals>
           <goal>report</goal>
        </goals>
     </execution>
  </executions>
</plugin>

子 POM:

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
    </plugin>

尝试切换 JaCoCo 版本,但 none 有所帮助,现在坚持使用最新的 0.8.2。 Maven 是最新的 - 3.6.0。除此之外,在子 pom 中配置的另一个插件是 PMD - 它的存在与否对报告没有任何影响。

类似问题:Gradle JaCoCo plugin - class and method names not clickable in report

Minimal, Complete, and Verifiable example that fully demonstrates steps to reproduce your difficulty, can only quote JaCoCo FAQ 缺席的情况下:

Why does the coverage report not show highlighted source code?

Make sure the following prerequisites are fulfilled to get source code highlighting in JaCoCo coverage reports:

  • Class files must be compiled with debug information to contain line numbers.
  • Source files must be properly supplied at report generation time.

关于第一点,请参阅 javac-g 选项、maven-compiler-plugin 的 debug and debuglevel 选项。

对于第二点,确保源文件 Example.java

package org.example;

位于src/main/java/org/example/Example.java

谢谢! @戈丁

确保指定 SourceDirectory 也很重要。在我的例子中 - 针对 Groovy 源文件,为了详细覆盖,您应该指定 child Maven 结构如下:

<build>
        <sourceDirectory>src/main/groovy</sourceDirectory>
        <plugins> ... </plugins>
</build>

这是我遇到的问题的组合。源目录和使用调试编译选项。 再次感谢。

在我的例子中,<sourceDirectory>src/main/java</sourceDirectory> 已经在 <build>..here..<plugins>..</plugins>..</build> 部分定义,并且为 Java 编译打开了调试选项,但 JaCoCo 报告中的链接仍然不可点击。

我必须做的是,在 Jacoco Plugin 中定义 <sourceDirectory> 配置(在 <plugins> 部分中定义)

Ex: 现在链接可以使用了,而且在我的例子中,我将覆盖率报告 data/files 放在一个自定义文件夹 (coverage/jacoco-report) 而不是使用默认值。您可以使用许多其他配置 fields/settings。

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.2</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <!-- attached to Maven test phase -->
            <execution>
                <id>report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
                <configuration>

                    <sourceDirectory>src/main/java</sourceDirectory>
                    <!-- see above -->
                    <outputDirectory>coverage/jacoco-report</outputDirectory>

                </configuration>
            </execution>
        </executions>
    </plugin>