JaCoCo 与 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 消息。

原文由 dasLort 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.2k
2 个回答

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

 mvn clean install jacoco:prepare-agent jacoco:report

你应该调用

mvn clean jacoco:prepare-agent install jacoco:report

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


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

 <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 元素在这里区分大小写,因此您的 datafile 元素被简单地忽略了,它应该是 dataFile 代替。这同样适用于 destFile

The prepare-agent goal is already using ${project.build.directory}/jacoco.exec as default destFile value, the same applied to the dataFile value for the report 目标。此更改的主要原因是更灵活和标准的构建,不依赖 artifactId 作为项目名称(默认,但仍然不是强制性的)并使用更通用的 ${project.build.directory} 属性而不是直接指向 target


最后注意:确保在 build/plugins 部分而不是 build/pluginManagement/plugins 部分配置 Jacoco 插件执行。 pluginManagement 部分用于版本或配置的治理和共同协调,但如果相应的插件未在 build/plugins 下声明,它将被 忽略

根据 官方 Maven POM 参考

pluginManagement :是一个与插件一起出现的元素。插件管理以几乎相同的方式包含插件元素,除了它不是为这个特定的项目构建配置插件信息,而是为了配置从这个构建继承的项目构建。 但是,这只会配置在子元素的 plugins 元素中实际引用的插件。孩子们完全有权覆盖 pluginManagement 定义。

(注意:粗体是我的)

原文由 A_Di-Matteo 发布,翻译遵循 CC BY-SA 3.0 许可协议

  • JaCoCo 报告是从执行数据文件中创建的。

  • 如果此文件不存在,则 JaCoCo 报告目标将跳过报告创建。

  • 因此必须创建执行数据文件。

无法创建执行数据文件的原因如下

- 测试不存在。

- 忽略所有测试。

- 缺少 Surefire 插件。

- JaCoCo 的 prepare-agent 目标未执行,这将配置所需的 argLine 设置为 surefire。

- Surefire 插件未配置 JaCoCo 的代理。

原文由 Shivkumar Kawtikwar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题