JaCoCo with Maven - 缺少执行数据文件

我们有一个 Maven 多模块项目,由一个父级 (HelloWorld) 和不同的子级(HelloWorldServices 和 HelloWorldPresentation)组成,并使用 Jenkins 进行构建。

运行成功测试后的错误为

[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:report (default-cli) @ HelloWorldServices ---
[INFO] Skipping JaCoCo execution due to missing execution data file:/var/lib/jenkins/workspace/HelloWorld/HelloWorldServices/target/jacoco.exec

它前面的行说

[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:prepare-agent (default-cli) @ HelloWorldServices ---
[INFO] argLine set to -javaagent:/var/lib/jenkins/.m2/repository/org/jacoco/org.jacoco.agent/0.7.6.201602180812/org.jacoco.agent-0.7.6.201602180812-runtime.jar=destfile=/var/lib/jenkins/workspace/HelloWorld/HelloWorldServices/target/jacoco.exec

这就是我定义父 pom JaCoCo 插件的方式:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <configuration>
        <destfile>${project.artifactId}/target/jacoco.exec</destfile>
        <datafile>${project.artifactId}/target/jacoco.exec</datafile>
    </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中,我没有明确提到surefire。我还尝试了你到处找到的东西,将argLine放在配置中,但结果都相同。JaCoCo .exec文件从未被创建过,无论我做什么。至于目标,我用

mvn clean install jacoco:prepare-agent jacoco:report

因为当我省略jacoco目标时,它甚至不显示INFO消息。


答案 1

您不应在安装阶段之后但在安装阶段之前调用代理,因此不要调用:

mvn clean install jacoco:prepare-agent jacoco:report

您应该调用

mvn clean jacoco:prepare-agent install jacoco:report

主要原因是:代理不会参与构建生命周期,阶段将作为阶段的一部分执行,然后Maven将按照命令行调用执行代理,但为时已晚。testinstall


您可能还应该将上面的插件配置更改为:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <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>

注意:我删除了配置部分,因为它实际上指向默认值。此外,XML 元素在这里区分大小写,所以你的元素被简单地忽略了,它应该被忽略了。这同样适用于 。datafiledataFiledestFile

准备代理目标已用作默认值,这与报表目标的值相同。此更改的主要原因是更灵活和标准的构建,不依赖于项目名称(默认值,但仍然不是强制性的),而是使用更通用的属性直接指向 。${project.build.directory}/jacoco.execdestFiledataFileartifactId${project.build.directory}target


最后一点说明:确保在部分而不是部分内配置Jacoco插件执行。该部分旨在用于版本或配置的治理和共同协调,但是如果未在 下声明相应的插件,则将忽略该部分。
根据官方的Maven POM参考build/pluginsbuild/pluginManagement/pluginspluginManagementbuild/plugins

pluginManagement:是一个与侧面插件一起看到的元素。插件管理以大致相同的方式包含插件元素,除了它不是为此特定项目构建配置插件信息,而是旨在配置从此构建继承的项目构建。但是,这仅配置在子级的插件元素中实际引用的插件。儿童完全有权凌驾于定义之上。pluginManagement

(注:粗体是我的)


答案 2
  • JaCoCo 报告是从执行数据文件创建的。
  • 如果此文件不存在,则 JaCoCo 报告目标将跳过报告创建。
  • 因此,必须创建执行数据文件。

无法创建执行数据文件的原因如下
- 测试不存在。
- 忽略所有测试。
- Surefire插件丢失。
- JaCoCo的准备代理目标未执行,这会将需要配置为确保火力的argLine设置为肯定。
- Surefire插件未配置JaCoCo的代理。


推荐