java 使用Maven的JaCoCo-缺少执行数据文件

6kkfgxo0  于 2023-05-12  发布在  Java
关注(0)|答案(6)|浏览(173)

我们有一个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里明确提到过万无一失。我还尝试了在配置中放置argLine的方法,但结果都一样。无论我做什么,JaCoCo.exec文件都从未创建过。至于目标,我用

mvn clean install jacoco:prepare-agent jacoco:report

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

4smxwvx5

4smxwvx51#

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

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
prepare-agent目标已经使用${project.build.directory}/jacoco.exec作为默认的destFile值,这同样适用于report目标的dataFile值。这一变化的主要原因是一个更灵活和标准的构建,不依赖于artifactId作为项目名称(默认,但仍然不是强制性的),而是使用更通用的${project.build.directory}属性直接指向target
最后一点:确保在build/plugins部分而不是build/pluginManagement/plugins部分配置Jacoco插件执行。pluginManagement部分用于版本或配置的治理和共同协调,但如果相应的插件不在build/plugins下声明,则将被忽略
根据official Maven POM reference

pluginManagement:是一个元素,是沿着边插件。Plugin Management包含插件元素的方式大致相同,不同之处在于它不是为这个特定的项目构建配置插件信息,而是打算配置从这个项目构建继承的项目构建。但是,这只配置子元素中plugins元素实际引用的插件。孩子们完全有权覆盖pluginManagement定义。

(note:大胆是我的)

fdbelqdn

fdbelqdn2#

  • JaCoCo报告从执行数据文件创建。
  • 如果此文件不存在,则JaCoCo报告目标将跳过报告创建。
  • 因此必须创建执行数据文件。
    无法创建执行数据文件的原因如下
  • 测试不存在。
  • 忽略所有测试。
  • Surefire插件丢失。
  • JaCoCo的prepare-agent目标没有被执行,这设置了argLine,这是配置确保成功所需要的。
  • Surefire插件没有配置JaCoCo的代理。
xeufq47z

xeufq47z3#

我今天刚刚处理了这个问题,发现当我在Surefire插件中设置argLine参数时(我需要这样做来运行JavaFX相关的测试),即使在您的jacoco-maven-plugin目标中有prepare-agent之后,它也会取代默认值。
因此,基本上,解决方案是添加原始的argLine,并使用@{argLine}附加额外的arg行,如here所示:

<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>

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

idv4meu8

idv4meu84#

我认为“destfile”和“datafile”是区分大小写的,所以尝试用“destFile”和“dataFile”替换它们,也许会起作用:)

j13ufse2

j13ufse25#

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</version>
    <configuration>
        <target>
            <propertyfile file="lombok.config">
                <entry key="config.stopBubbling" value="true" />
                <entry key="lombok.addLombokGeneratedAnnotation" value="true" />
            </propertyfile>
        </target>
        <excludes>
            <exclude>**/domain/**</exclude>
            <exclude>**/enumeration/**</exclude>
            <exclude>**/exception/**</exclude>
        </excludes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <!-- attached to Maven test phase -->
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
        <!-- Add this checking -->
        <execution>
            <id>jacoco-check</id>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <rule>
                        <element>PACKAGE</element>
                        <limits>
                            <limit>
                                <counter>INSTRUCTION</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>65%</minimum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>
toe95027

toe950276#

我和你分享我的React可能是别人为他工作

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.5</version>
<!--                <configuration>
                    <excludes>
                        <exclude>package you want exclude</exclude>
                    </excludes>
                </configuration>-->
                <executions>
                    <execution>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <!-- attached to Maven test phase -->
                    <execution>
                        <id>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.9</minimum>
                                        </limit>
                                    </limits>
                                </rule>
                            </rules>
                        </configuration>
                    </execution>-->

                </executions>
            </plugin>

相关问题