【问题标题】:Getting "Skipping JaCoCo execution due to missing execution data file" upon executing JaCoCo执行 JaCoCo 时出现“由于缺少执行数据文件而跳过 JaCoCo 执行”
【发布时间】:2013-08-09 01:33:40
【问题描述】:

我正在使用 Maven 3.0.3、JUnit 4.8.1 和 Jacoco 0.6.3.201306030806,并且正在尝试创建测试覆盖率报告。

我有一个只有单元测试的项目,但我无法运行报告,我反复收到错误:Skipping JaCoCo execution due to missing execution data file 运行时:

mvn clean install -P test-coverage

这是我的 pom 的配置方式:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx2048m</argLine>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>
...
<profile>
  <id>test-coverage</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.6.3.201306030806</version>
        <configuration>
          <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
          <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
        </configuration>
        <executions>
          <execution>
            <id>prepare-unit-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <!-- prepare agent for measuring integration tests -->
          <execution>
            <id>prepare-integration-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
              <propertyName>itCoverageAgent</propertyName>
            </configuration>
          </execution>
          <execution>
            <id>jacoco-site</id>
            <phase>verify</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>

我的所有测试都成功运行。以下是 Maven 的一些输出:

[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-unit-tests) @ myproject ---
[INFO] argLine set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec
[INFO] 
    ...
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0

[INFO]
    ...
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-integration-tests) @ myproject ---
[INFO] itCoverageAgent set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec 
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:integration-test (default) @ myproject ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:verify (default) @ myproject ---
[INFO] Failsafe report directory: /Users/davea/Dropbox/workspace/myproject/target/failsafe-reports
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:report (jacoco-site) @ myproject ---
[INFO] Skipping JaCoCo execution due to missing execution data file
[INFO] 

任何想法我缺少什么配置?

【问题讨论】:

标签: maven junit jacoco


【解决方案1】:

jacoco-maven-plugin:0.7.10-SNAPSHOT

来自jacoco:prepare-agent 说:

在 maven-surefire-plugin 的情况下执行此操作的方法之一是 使用语法进行后期属性评估:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <argLine>@{argLine} -your -extra -arguments</argLine>
  </configuration>
</plugin>

注意添加到-your -extra -arguments@{argLine}

感谢Slava Semushin 注意到更改和reporting in the comment

jacoco-maven-plugin:0.7.2-SNAPSHOT

按照jacoco:prepare-agent 的说法:

[org.jacoco:jacoco-maven-plugin:0.7.2-SNAPSHOT:prepare-agent] 准备一个指向 JaCoCo 运行时代理的属性,可以 作为 VM 参数传递给被测应用程序。根据 项目打包类型默认一个属性,如下 名称已设置:

  • tycho.testArgLine 用于封装类型 eclipse-test-plugin 和
  • argLine 否则。

请注意,这些属性不能被 测试配置,否则无法附加 JaCoCo 代理。如果 您需要自定义参数,请附加它们。例如:

<argLine>${argLine} -your -extra -arguments</argLine>

结果 覆盖信息是在执行期间收集的,默认情况下 进程终止时写入文件。

您应该将maven-surefire-plugin 插件配置中的以下行从(注意${argLine}&lt;argLine&gt;)更改:

<argLine>-Xmx2048m</argLine>

<argLine>${argLine} -Xmx2048m</argLine>

对另一个插件 maven-failsafe-plugin 进行必要的更改并替换以下内容(再次注意 ${argLine}):

<argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

【讨论】:

  • 现在,this 的问题,没有 jacoco 目标,构建失败。
  • 工作过,但我必须使用 tycho.testArgLine,因为我使用的是 tycho。
  • 引用的链接现在有一点不同的建议来使用@{argLine}
  • 这正是我的问题。我在 mvn 命令mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy" 中有自定义参数。我没有明确声明 maven-surefire-plugin 并设置配置。我只是在 maven 命令行中添加 argLine 占位符,例如 mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy"。现在 jacoco.exec 文件已生成并在声纳中生成覆盖率报告。
  • 有效!!!问题是由于我在 maven-surefire-plugin 上添加的 配置以增加集成测试的内存配置 ${argLine} --my--additional-arguments--here-- 解决了问题
【解决方案2】:

我遇到了一个返回相同错误的不同问题。

Skipping JaCoCo execution due to missing execution data /target/jacoco.exec

事实是,返回此错误的原因有很多。 我们在 Stack Overflow 上尝试了不同的解决方案,但发现 resource 是最好的。它消除了 Jacoco 可能返回相同错误的许多不同的潜在原因。

对我们来说,解决方案是在配置中添加一个 prepare-agent。

<execution>
   <id>default-prepare-agent</id>
   <goals>
       <goal>prepare-agent</goal>
   </goals>
</execution>

我想大多数用户会出于不同的原因体验它,因此请查看上述资源!

【讨论】:

  • 我认为你成功了。人们可能会在谷歌上搜索“快速修复”,但最正确的答案是“事实是,这个错误的返回有很多很多的原因”。只需要找出那是什么。对我来说,这是一个父 pom 覆盖了 maven-surefire-plugin 中的
  • 这个!谢谢。我收到了同样的消息,但这是因为当我的测试类被命名为*Tests.java时,我的surefire插件只在寻找名为**/*Test.java的文件
  • 我遇到了两个问题:1. 没有任何测试类,至少需要一个*Test.java 类和一个用@Test 注释的测试方法,这样Jacoco 就可以做点什么。 2. 在我的项目的 Travis 环境变量中,SONART_TOKEN=***** 有错字,应该命名为SONAR_TOKEN=*****。请参阅 Travis 文档 here,搜索 or define SONAR_TOKEN in your Repository Settings。在我修复它之后,构建成功运行。 You may view my gitbhub project in question.
【解决方案3】:

由于项目中缺少测试,也可能会出现“由于缺少执行数据文件而跳过 JaCoCo 执行”错误。例如,当您启动新项目并且根本没有 *Test.java 文件时。

【讨论】:

    【解决方案4】:

    在某些情况下,pom 中的其他一些 argline 设置或插件可能会覆盖 jacoco 执行顺序设置。

    argLine 设置为 -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec

    一个例子

               <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.16</version>
                    <configuration>
                        <forkCount>5</forkCount>
                        <reuseForks>true</reuseForks>
                        <argLine>-Dnet.sf.ehcache.disabled=true</argLine>
                    </configuration>
                </plugin>
    

    从这些插件中去掉 argLine 后,jacoco 开始正常工作了。

    【讨论】:

      【解决方案5】:

      我知道这个问题已经很老了,但是如果像我这样的人来这里寻找答案,那么这可能会有所帮助。我已经能够克服上述错误。

      1) 从插件 maven-surefire-plugin 中删除以下代码

       <reuseForks>true</reuseForks>
       <argLine>-Xmx2048m</argLine>
      

      2) 添加以下目标:

      <execution>
      <id>default-prepare-agent</id>
      <goals>
         <goal>prepare-agent</goal>
      </goals>
      </execution>
      

      【讨论】:

        【解决方案6】:

        F tdrury 说的:

        把你的插件配置改成这样:

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.6.3.201306030806</version>
            <executions>
              <!-- prepare agent for measuring integration tests -->
              <execution>
                <id>prepare-integration-tests</id>
                <phase>pre-integration-test</phase>
                <goals>
                  <goal>prepare-agent</goal>
                </goals>
                <configuration>
                  <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile>
                </configuration>
              </execution>
              <execution>
                <id>jacoco-site</id>
                <phase>post-integration-test</phase>
                <goals>
                  <goal>report</goal>
                </goals>
                <configuration>
                  <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile>
                </configuration>
              </execution>
            </executions>
          </plugin>
        

        编辑: 刚刚注意到一件重要的事情,destFile 和 dataFile 似乎区分大小写,所以它应该是 destFile,而不是 destfile。

        【讨论】:

          【解决方案7】:

          我已经尝试了所有答案,但只有以下建议组合对我有用。为什么?我有非常具体的要求:

          1. JaCoCo 在从命令行运行构建时生成报告:mvn clean verify (Maven 3.6.0)
          2. Intellij IDEA (2019.01) 也运行我的测试
          3. 这一切都可以在 surefire 插件中定义的另一个 javaagent 的存在下工作

          解决方案 - 如surefire FAQ (my fixed configuration) 中所述,在 surefire 配置中使用“后期替换” maven 属性 @{...} 预先添加 argLine

          如何在 argLine 中使用其他插件设置的属性? Maven 进行属性替换

          ${...} 在运行任何插件之前 pom.xml 中的值。所以 Surefire 永远不会在其 argLine 属性中看到占位符。 由于 2.17 版对这些属性使用了另一种语法,

          @{...} 允许在插件执行时延迟替换属性,因此被其他插件修改的属性将被正确拾取。

          第一次尝试失败 - prepare-agentjacoco 目标配置中的 define jaCoCoArgLine 属性 - 场景未能满足我的第二个要求,IntelliJ IDEA 无法找出我在项目中用于静态方法的 jmockit 代理嘲讽

          【讨论】:

          • 与 JMockit 一起使用时遇到了同样的问题,并且能够使用此解决方案解决问题。即在surefire插件中添加argLine
          【解决方案8】:

          刚刚遇到同样的问题。

          我有一个名为HelloWorld 的类,我为它创建了一个名为HelloWorldTests 的测试类,然后我得到了输出Skipping JaCoCo execution due to missing execution data file.

          然后我尝试更改我的pom.xml 以使其正常工作,但尝试失败。

          最后,我简单地将HelloWorldTests 重命名为HelloWorldTest,就成功了!

          所以我猜,默认情况下,jacoco 只识别名为XxxTest 的测试类,这表明它是Xxx 的测试类。因此,只需将您的测试类重命名为这种格式就可以了!

          【讨论】:

            【解决方案9】:

            使用 maven-surefire-plugin 或 maven-failsafe-plugin 时,您不得使用 0 的 forkCount 或将 forkMode 设置为 never,因为这会阻止使用 javaagent 集执行测试并且不会记录覆盖率.

            参考:https://www.eclemma.org/jacoco/trunk/doc/maven.html

            这是我的gist

            【讨论】:

              【解决方案10】:

              我挣扎了好几天。我尝试了此线程中建议的所有不同配置。它们都不起作用。最后,我发现只有重要的配置是 prepare-agent 目标。但是你必须把它放在正确的阶段。我看到很多例子把它放在“pre-integration-test”中,这是一种误导,因为它只会在单元测试之后执行。所以单元测试不会被检测。

              正确的配置应该只使用默认阶段,(不要明确指定阶段)。通常,您不需要围绕 maven-surefire-plugin

                <plugin>
                  <groupId>org.jacoco</groupId>
                  <artifactId>jacoco-maven-plugin</artifactId>
                  <version>0.8.4</version>
                  <executions>
                    <execution>
                      <id>default-prepare-agent</id>
                      <goals>
                        <goal>prepare-agent</goal>
                      </goals>
                    </execution>
                    <execution>
                      <id>jacoco-site</id>
                      <phase>post-integration-test</phase>
                      <goals>
                        <goal>report</goal>
                      </goals>
                    </execution>
                  </executions>
                </plugin>
              

              【讨论】:

                【解决方案11】:

                尝试使用:

                mvn jacoco:report -debug
                

                查看有关您的报告流程的详细信息。

                我这样配置我的 jacoco:

                <configuration>
                    <dataFile>~/jacoco.exec</dataFile>
                    <outputDirectory>~/jacoco</outputDirectory>
                </configuration>
                

                然后mvn jacoco:report -debug 使用默认配置显示它,这意味着jacoco.exec 不在~/jacoco.exec 中。错误为missing execution data file

                所以只需使用默认配置:

                <execution>
                    <id>default-report</id>
                    <goals>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/jacoco.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
                    </configuration>
                </execution>
                

                一切正常。

                【讨论】:

                  【解决方案12】:

                  我添加了一个Maven/Java project,其中包含 1 个具有以下功能的域类:

                  • 单元或集成测试,使用插件 Surefire 和 Failsafe。
                  • 查找错误。
                  • 通过 Jacoco 测试覆盖率。

                  Jacoco 结果在哪里?测试并运行“mvn clean”后,您可以在“target/site/jacoco/index.html”中找到结果。在浏览器中打开此文件。

                  享受吧!

                  我试图让项目尽可能简单。该项目将来自这些帖子的许多建议放在一个示例项目中。 感谢贡献者!

                  【讨论】:

                  • 我试过你的git项目,但不清楚如何查看报告。
                  • Jacoco 结果在哪里?测试并运行“mvn clean”后,您可以在“target/site/jacoco/index.html”中找到结果。在浏览器中打开此文件。
                  • 您可能希望将您的存储库链接回 stackoverflow。在您的演示中发现错误后,我很难再次找到问题。
                  • 并且仍然无法按预期工作 :-( 目标目录只有 aggregate.exec 作为执行 mvn clean install 时的内容 ...
                  【解决方案13】:

                  我遇到了同样的问题。我将 Jacoco 版本从 0.6 更新到 0.8 并更新了 surefire 插件。以下命令在 site/jacoco/ 文件夹中生成 Jacoco 报告:

                  mvn clean jacoco:prepare-agent install jacoco:report
                  

                  我的maven配置如下:

                  <plugins>
                      <plugin>
                          <groupId>org.jacoco</groupId>
                          <artifactId>jacoco-maven-plugin</artifactId>
                          <version>0.8.6</version>
                          <executions>
                              <execution>
                                  <goals>
                                      <goal>prepare-agent</goal>
                                  </goals>
                              </execution>
                              <execution>
                                  <id>jacoco-report</id>
                                  <phase>test</phase>
                                  <goals>
                                      <goal>report</goal>
                                  </goals>
                                      </execution>
                              <execution>
                                  <id>jacoco-check</id>
                                  <goals>
                                      <goal>check</goal>
                                  </goals>
                                  <configuration>
                                      <rules>
                                          <rule>
                                              <element>PACKAGE</element>
                                              <limits>
                                                  <limit>
                                                      <counter>LINE</counter>
                                                      <value>COVEREDRATIO</value>
                                                      <minimum>0.0</minimum>
                                                  </limit>
                                              </limits>
                                          </rule>
                                      </rules>
                                  </configuration>
                              </execution>
                          </executions>
                      </plugin>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-surefire-plugin</artifactId>
                          <version>3.0.0-M5</version>
                          <configuration>
                              <forkedProcessExitTimeoutInSeconds>60</forkedProcessExitTimeoutInSeconds>
                              <forkCount>1</forkCount>
                          </configuration>
                      </plugin>
                  </plugins>
                  

                  【讨论】:

                    【解决方案14】:

                    我知道这已经晚了,但仅适用于遇到此问题且似乎没有任何解决方法的其他人(就像我一样)。确保在你的 pom 中,plugins 内的 jacoco 配置不在 pluginManagement 内。 maven 的某种默认设置似乎是将plugins 放在pluginManagement 中。在您尝试添加像 jacoco 这样的详细配置之前,这几乎不会引起注意。为了添加这些,您需要将它们添加到pluginManagement 之外,否则它们将被有效地忽略。有关详细信息,请参阅下面的我的 poms。

                    我的旧 pom(它给出了“跳过 jacoco ...”的消息):

                    <project>
                      ...
                      <build>
                        <pluginManagement>
                          <plugins>
                            ...
                            <plugin>
                              <groupId>org.jacoco</groupId>
                              <artifactId>jacoco-maven-plugin</artifactId>
                              <version>0.8.2</version>
                              <executions>
                                <execution>
                                  <id>default-prepare-agent</id>
                                  <goals>
                                    <goal>prepare-agent</goal>
                                  </goals>
                                </execution>
                                <execution>
                                  <id>default-report</id>
                                  <phase>test</phase>
                                  <goals>
                                    <goal>report</goal>
                                  </goals>
                                </execution>
                              </executions>
                            </plugin>
                          </plugins>
                        </pluginManagement>
                      </build>
                    </project>
                    

                    我的新 pom(现在可以编译一个有效的 jacoco 报告):

                    <project>
                      ...
                      <build>
                        <pluginManagement>
                          <plugins>
                            ...
                            <plugin>
                              <groupId>org.jacoco</groupId>
                              <artifactId>jacoco-maven-plugin</artifactId>
                              <version>0.8.2</version>
                            </plugin>
                          </plugins>
                        </pluginManagement>
                        <plugins>
                          <plugin>
                            <groupId>org.jacoco</groupId>
                            <artifactId>jacoco-maven-plugin</artifactId>
                            <executions>
                                <execution>
                                  <id>default-prepare-agent</id>
                                  <goals>
                                    <goal>prepare-agent</goal>
                                  </goals>
                                </execution>
                                <execution>
                                  <id>default-report</id>
                                  <phase>test</phase>
                                  <goals>
                                    <goal>report</goal>
                                  </goals>
                                </execution>
                              </executions>
                          </plugin>
                        </plugins>
                      </build>
                    </project>
                    

                    【讨论】:

                      【解决方案15】:

                      如果您的项目路径在任何地方都有空格,则会发生这种情况,例如:

                      /home/user/my projects/awesome project

                      报告未生成。如果是这种情况,请从目录名称中删除这些空格,例如:

                      /home/user/my-projects/awesome-project

                      或将项目移动到沿途没有空格的目录。

                      关于插件配置,我只需要基本如下:

                      <plugin>
                          <groupId>org.jacoco</groupId>
                          <artifactId>jacoco-maven-plugin</artifactId>
                          <version>0.8.5</version>
                          <executions>
                              <execution>
                                  <id>jacoco-initialize</id>
                                  <goals>
                                      <goal>prepare-agent</goal>
                                  </goals>
                              </execution>
                              <execution>
                                  <id>jacoco-report</id>
                                  <goals>
                                      <goal>report</goal>
                                  </goals>
                              </execution>
                          </executions>       
                      </plugin>
                      

                      【讨论】:

                        【解决方案16】:

                        执行说它将 jacoco 数据放入 /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec 但您的 maven 配置正在查找 ${basedir}/target/coverage-reports/jacoco 中的数据-unit.exec.

                        【讨论】:

                        • 对了,为什么插件会忽略我在配置中指定的内容?
                        • 尝试将您的 destfile 配置移动到 prepare-agent 执行的配置中。并非所有 maven 插件都能优雅地处理配置继承。
                        【解决方案17】:

                        我的回复很晚,但对于其他用户 在您的情况下,您必须配置故障安全插件以使用保存在 itCoverageAgent 变量中的命令行代理配置。 例如

                        <configuration>
                            <argLine>${itCoverageAgent}</argLine>
                        </configuration>
                        

                        在您的 maven 配置中,jacoco 在 prepare-agent 阶段准备命令行参数,但故障安全插件不使用它,因此没有执行数据文件。

                        【讨论】:

                          【解决方案18】:

                          有时执行是第一次运行,当我们执行 maven clean install 时,它不会在之后生成。 问题是对 skipMain 和 skip 属性使用 true 在主 pom 文件的 maven-compiler-plugin 下。 如果它们是作为任何问题或建议的一部分引入的,请将它们删除。

                          【讨论】:

                            【解决方案19】:

                            在我的例子中,prepare 代理在配置中有一个不同的destFile,但是相应的报告必须配置一个dataFile,但是这个配置丢失了。一旦添加了dataFile,它就开始正常工作了。

                            【讨论】:

                              【解决方案20】:

                              我遇到了类似的错误,因为测试执行被跳过了。

                              我使用类似的系统参数运行我的构建:-Dmaven.test.skip.exec=true

                              将此系统参数设置为false 解决了这个问题。

                              【讨论】:

                                猜你喜欢
                                • 2022-06-14
                                • 2021-05-29
                                • 2016-07-18
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多