【问题标题】:JaCoCo not generating jacoco.exec until after skipping JaCoCo executionJaCoCo 直到跳过 JaCoCo 执行后才生成 jacoco.exec
【发布时间】:2015-10-23 02:30:05
【问题描述】:

我在我的一个模块中无法通过 JaCoCo 生成 AHP 报告。当构建开始时,我看到 JaCoCo 正确设置了 argLine:

[INFO] jacoco.agent.argLine set to -javaagent:<...>/.m2/repository/org/jacoco/org.jacoco.agent/0.7.2.201409121644/org.jacoco.agent-0.7.2.201409121644-runtime.jar=destfile=<...>/target/jacoco.exec

但是,当 maven 尝试运行 JaCoCo 时,.exec 尚未创建:

[INFO] Skipping JaCoCo execution due to missing execution data file:<...>/target/jacoco.exec

在 maven 跳过 JaCoCo 执行之后,最终会创建 jacoco.exec。因此,如果我在不清理的情况下重新运行构建,我仍然可以生成 AHP 报告。

我在其他各种问题中看到了在使用 Maven Surefire 和 JaCoCo 时需要小心的问题。但是,我没有在我的 Surefire 插件或任何插件中明确使用 argLine。我开始怀疑其他插件之一是否像 JaCoCo 那样自动劫持 argLine 参数。

这里是使用的所有插件的列表:

  • jacoco-maven-plugin
  • vertx-maven-plugin
  • maven 资源插件
  • maven 依赖插件
  • maven-surefire-plugin
  • maven-failsafe-plugin
  • maven-surefire-report-plugin
  • maven 组装插件

我确实在构建输出中看到了一条可疑消息:

[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ <module> ---
[INFO] Changes detected - recompiling the module!

我不确定这是否相关,但它在跳过消息之前出现了两次,并且没有出现在 JaCoCo 正常工作的模块中。

有什么想法吗?

*edit - 这是 jacoco 配置

    <plugins>
        <...>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.jacoco</groupId>
                                    <artifactId>
                                        jacoco-maven-plugin
                                    </artifactId>
                                    <versionRange>
                                        [0.7.2.201409121644,)
                                    </versionRange>
                                    <goals>
                                        <goal>prepare-agent</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

我不确定插件管理部分到底在做什么,但将其注释掉并不能解决任何问题。我还尝试将 JaCoCo 插件配置放在surefire/failsafe 配置之上,以防顺序对于共享相同目标的插件很重要,但这也无济于事。

*edit 2 - 看起来问题出在 Surefire 的包含问题上。以某种方式将它们注释掉可以修复 JaCoCo 的 .exec 生成,并且 JaCoCo 可以正常工作。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven.surefire.plugin.version}</version>
            <configuration>
                <!-- <includes>
                    <include>**/unit/**/*Test*.java</include>
                </includes> -->
            </configuration>
        </plugin>

有人知道为什么吗?

【问题讨论】:

标签: maven jacoco


【解决方案1】:

只是对已经给出的答案的补充。 在您的 maven-surefire-plugin 配置中,您可能已经使用 argLine 配置来覆盖所使用的内存之类的东西。如果这样做,将不会使用 jacoco-maven-plugin 设置的 argline 无法生成 jacoco 报告。 在这种情况下,为 jacoco-maven-plugin 配置分配一个属性名称,然后在 maven-surefire-plugin argLine 参数中引用它。

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.9</version>
            <executions>
                <!-- prepare agent for measuring unit tests -->
                <execution>
                    <id>prepare-unit-tests</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <append>true</append>
                        <destFile>${sonar.jacoco.reportPath}</destFile>
                        <!-- Sets the VM argument line used when unit tests are run. -->
                        <propertyName>surefireArgLine</propertyName>
                    </configuration>
                </execution>
            </executions>
        </plugin>

[...]

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <printSummary>false</printSummary>
                <redirectTestOutputToFile>true</redirectTestOutputToFile>
                <forkCount>3</forkCount>
                <reuseForks>true</reuseForks>
                <argLine>${surefireArgLine} -Xmx1024m -noverify</argLine>                  
            </configuration>
        </plugin>

【讨论】:

  • 谢谢!这对我来说不太奏效。我不得不使用@{surefireArgLine},即后期属性评估:maven.apache.org/surefire/maven-surefire-plugin/…
  • 非常感谢@Massimo,argLine 也是我的解决方案!
  • 太棒了!这正是我的情况:在我向surefire-plugin 添加内存后,jacoco 停止生成jacoco.exectarget/site,因为繁重的测试崩溃了。
  • 终于解决了这个问题!谢谢 - 万无一失的论点肯定让我朝着正确的方向前进。
【解决方案2】:

为了解决这个问题,我将使用以下三个步骤:

  1. 确定哪个插件执行正在生成jacoco.exec 文件。为此,您可以在启用调试日志记录 (mvn -X) 的情况下运行 Maven,并在输出中查找 jacoco.agent.argLine 属性名称或其值。如果相关配置来自父 POM,您还可以查看有效的 POM (mvn help:effective-pom)。请注意,我的猜测是它是 maven-failsafe-plugin 的执行。

  2. 确定插件执行的阶段。例如对于maven-failsafe-plugin,这可能是integration-test

  3. 更改 JaCoCo 插件的配置,以便稍后在 build lifecycle 中执行 report 目标。例如。如果jacoco.exec文件是在integration-test阶段产生的,你可以在post-integration-test阶段执行report目标。

【讨论】:

  • 谢谢,这些命令行参数对我理解 maven 在幕后做了什么非常有帮助。对我来说没有什么特别突出的,所以我开始评论插件,直到我发现以下内容。 * 编辑 - 将发现放在问题的编辑 2 中
【解决方案3】:

对我来说,没有生成 exec 文件的原因之一是当我将 prepare-agent 、 prepare-package 目标放在 pluginManagement 的插件部分中时

当我尝试相同的外部 pluginManagement 时,我成功地能够运行相同的并且使用 mvn clean install 命令生成 jacoco-exec 文件

我的 pomfile 如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>mmt</groupId>
  <artifactId>jacoco</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <name>jacoco</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <argLine>-Xms256m -Xmx1524m -XX:MaxPermSize=256m -Duser.language=en</argLine>
 </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>


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

【讨论】:

    【解决方案4】:

    在我的情况下,解决方案是@massimo 提到的,我在&lt;surefireArgLine&gt; 标签内覆盖内存值,在我删除标签后它开始生成报告并显示代码覆盖率。

    【讨论】:

      【解决方案5】:

      我没有找到任何解决方案,但我做了以下操作:

      mvn clean jacoco:prepare-agent install 创建文件 jacoco.exec,但执行 mvn sonar:sonar not create File。

      解决方案:

      第 1 步: mvn clean jacoco:prepare-agent install

      第 2 步: 从 /src/main/resources 复制文件 jacoco.exec 第三步:

      在 pom.xml 中添加下一个插件

      <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-resources-plugin</artifactId>
                      <version>2.7</version>
                      <executions>
                          <execution>
                              <id>copy-resources</id>
                              <phase>validate</phase>
                              <goals>
                                  <goal>copy-resources</goal>
                              </goals>
                              <configuration>
                                  <outputDirectory>
                                      ${basedir}/target/</outputDirectory>
                                  <resources>
                                      <resource>
                                          <directory>
                                              ${basedir}/src/main/resources/ </directory>
                                          <includes>
                                              <include>jacoco.exec</include>
                                          </includes>
                                      </resource>
                                  </resources>
                              </configuration>
                          </execution>
                      </executions>
                      <configuration>
                          <encoding>cp1252</encoding>
                      </configuration>
                  </plugin>
      

      第 4 步: mvn 全新安装

      第 5 步:

      mvn 声纳:声纳

      准备好了

      添加我的部分插件

      <pluginManagement>
              <plugins>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.6.1</version>
                      <configuration>
                          <source>1.7</source>
                          <target>1.7</target>
                          <encoding>cp1252</encoding>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-resources-plugin</artifactId>
                      <version>2.7</version>
                      <executions>
                          <execution>
                              <id>copy-resources</id>
                              <phase>validate</phase>
                              <goals>
                                  <goal>copy-resources</goal>
                              </goals>
                              <configuration>
                                  <outputDirectory>
                                      ${basedir}/target/</outputDirectory>
                                  <resources>
                                      <resource>
                                          <directory>
                                              ${basedir}/src/main/resources/ </directory>
                                          <includes>
                                              <include>jacoco.exec</include>
                                          </includes>
                                      </resource>
                                  </resources>
                              </configuration>
                          </execution>
                          <execution>
                              <id>copy-folder</id>
                              <phase>package</phase>
                              <goals>
                                  <goal>copy-resources</goal>
                              </goals>
                              <configuration>
                                  <outputDirectory>${project.build.directory}</outputDirectory>
                                  <resources>
                                      <resource>
                                          <filtering>false</filtering>
                                          <directory>${project.basedir}/src/main/resources</directory>
                                      </resource>
                                  </resources>
                              </configuration>
                          </execution>
                      </executions>
                      <configuration>
                          <encoding>cp1252</encoding>
                      </configuration>
                  </plugin>
                  <!-- Plugin Sonar -->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-release-plugin</artifactId>
                      <version>2.5.1</version>
                  </plugin>
                  <plugin>
                      <groupId>org.jacoco</groupId>
                      <artifactId>jacoco-maven-plugin</artifactId>
                      <version>0.7.6.201602180812</version>
      
                      <configuration>
                          <destFile>${project.build.directory}/jacoco.exec</destFile>
                      </configuration>
      
                      <executions>
                          <execution>
                              <id>jacoco-initialize</id>
                              <goals>
                                  <goal>prepare-agent</goal>
                              </goals>
                              <configuration>
                                  <destFile>${basedir}/target/jacoco.exec</destFile>
                                  <dataFile>${basedir}/target/jacoco.exec</dataFile>
                              </configuration>
                          </execution>
                          <execution>
                              <id>jacoco-site</id>
                              <phase>package</phase>
                              <goals>
                                  <goal>report</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </pluginManagement>
      

      【讨论】:

        【解决方案6】:

        我也遇到了同样的问题,将 jacoco 插件添加到父 pom 中,并且为其中一个子模块生成 jacoco.exec 文件。我必须删除 maven surefire 插件的 argLine 参数,然后生成它。

        【讨论】:

        • argLine 参数已从未生成 exec 文件的子模块中删除。
        猜你喜欢
        • 2015-01-18
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 2022-06-14
        • 2020-06-27
        • 1970-01-01
        相关资源
        最近更新 更多