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

das*_*ort 18 java pom.xml maven-3 maven jacoco-maven-plugin

我们有一个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
Run Code Online (Sandbox Code Playgroud)

它之前的线条说

[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
Run Code Online (Sandbox Code Playgroud)

这是我定义父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>
Run Code Online (Sandbox Code Playgroud)

在没有pom的情况下,我明确提到了万无一失.我也尝试了你在任何地方找到的argLine配置,但都具有相同的结果.无论我做什么,JaCoCo .exec文件从未创建过.至于目标,我用

mvn clean install jacoco:prepare-agent jacoco:report
Run Code Online (Sandbox Code Playgroud)

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

A_D*_*teo 30

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

mvn clean install jacoco:prepare-agent jacoco:report
Run Code Online (Sandbox Code Playgroud)

你应该调用

mvn clean jacoco:prepare-agent install jacoco:report
Run Code Online (Sandbox Code Playgroud)

主要原因是:代理不参与构建生命周期,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>
Run Code Online (Sandbox Code Playgroud)

注意:我删除了配置部分,因为它实际上指向了默认值.此外,XML元素在这里是区分大小写的,因此您的datafile元素被简单地忽略了,它本来应该是dataFile.这同样适用于destFile.

prepare-agent目标已经使用${project.build.directory}/jacoco.exec默认destFile值,这同样适用于在dataFile为价值report目标.这种改变的主要原因是更灵活和标准的构建,不依赖于artifactId项目名称(默认,但仍然不是强制性的),而是使用更通用的${project.build.directory}属性来直接指向target.


最后注意事项:确保在build/plugins部分而不是build/pluginManagement/plugins部分中配置Jacoco Plugin执行.本pluginManagement节适用于版本或配置的治理和通用协调,但如果相应的插件不在声明下,则会被忽略build/plugins.
根据官方Maven POM参考

pluginManagement:是一个沿侧插件看到的元素.插件管理以大致相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个继承的项目构建.但是,这仅配置在子节点的plugins元素实际引用的插件.孩子们有权覆盖pluginManagement定义.

(注意:大胆是我的)


小智 6

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

不会创建执行数据文件的原因如下
- 不存在测试。
- 所有测试都被忽略。
- 缺少 Surefire 插件。
- JaCoCo 的prepare-agent 目标没有执行,这将需要配置的argLine 设置为surefire。
- Surefire 插件没有配置 JaCoCo 的代理。


Dex*_*spi 5

我今天刚刚处理了这个问题,发现当我argLine在 Surefire 插件中设置参数时会发生这种情况(我需要运行 JavaFx 相关测试),即使您已经实现了目标,它也会替换默认prepare-agentjacoco-maven-plugin

所以基本上,解决方案是添加原始 argLine 并使用此处@{argLine}所述的附加附加 arg 行:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M5</version>
  <configuration>
    <argLine>@{argLine} --enable-native-access ALL-UNNAMED --add-modules jdk.incubator.foreign</argLine>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

在那篇文章中提到分配 jacoco agent argline 变量${surefire.argLine},但我认为这些步骤不是必需的(至少在我的情况下不是)。