JaCoCo在跳过JaCoCo执行之后才生成jacoco.exec

pus*_*eal 11 maven jacoco

我在我的一个模块中通过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
Run Code Online (Sandbox Code Playgroud)

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

[INFO] Skipping JaCoCo execution due to missing execution data file:<...>/target/jacoco.exec
Run Code Online (Sandbox Code Playgroud)

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

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

以下是使用的所有插件的列表:

  • jacoco - Maven的插件
  • vertx - Maven的插件
  • Maven的资源 - 插件
  • Maven的依赖关系的插件
  • Maven的万无一失,插件
  • Maven的故障保护,插件
  • Maven的万无一失报告,插件
  • 行家组装-插件

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

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

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

有任何想法吗?

*编辑 - 这是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>
Run Code Online (Sandbox Code Playgroud)

我不确定该插件管理部分究竟在做什么,但是评论它并没有解决任何问题.我也尝试将JaCoCo插件配置置于surefire/failsafe配置之上,以便对于共享相同目标的插件有重要意义,但这也无济于事.

*编辑2 - 看起来问题是肯定的包括.评论它们以某种方式修复了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>
Run Code Online (Sandbox Code Playgroud)

谁知道为什么?

And*_*hen 5

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

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

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

  3. 更改 JaCoCo 插件的配置,以便report构建生命周期稍后执行目标。例如,如果jacoco.exec文件是在integration-test阶段中生成的,则您可以reportpost-integration-test阶段中执行目标。


Mas*_*imo 5

只是已经给出的答案的补充。可能发生的是,在您的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>
Run Code Online (Sandbox Code Playgroud)

[...]

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

  • 谢谢!它对我来说不太有效。我必须使用@{surefireArgLine},即后期属性评估:http://maven.apache.org/surefire/maven-surefire-plugin/faq.html#late-property-evaluation (4认同)

小智 5

就我而言,解决方案是@massimo提到的,我正在覆盖<surefireArgLine>标签内的内存值,在删除标签后,它开始生成报告并显示代码覆盖率。