【发布时间】: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: not generating code coverage report 上的回答。