如何使用Java 7和spring-instrument运行Jacoco?

时间:2013-06-19 08:57:24

标签: java maven code-coverage java-7 jacoco

因为我在使用cobertura和Java 7时遇到了一些问题 - 我正在尝试使用 Jacoco 。 我的项目有一个父pom.xml和子项目。 在一个项目中,我使用spring来运行一些集成测试 - 所以我在这个项目的pom.xml中有这个插件:

<plugin>
    <version>2.12.4</version>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <!-- -XX:-UseSplitVerifier is for java 7 -->
        <argLine>
            -XX:-UseSplitVerifier 
            -javaagent:${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar
        </argLine>
    </configuration>
</plugin>

由于我使用Java 7,因此我在父pom.xml中设置了此插件:

<plugin>
    <version>2.5.1</version>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.7</source>
    <target>1.7</target>
    <optimize>true</optimize>
    <debug>true</debug>
    <showDeprecation>true</showDeprecation>
    <showWarnings>true</showWarnings>
    <encoding>utf8</encoding>
    </configuration>
</plugin>

现在,当我使用mvn clean install时,所有项目都在/target文件夹中包含此文件:jacoco.exec ;但是这个使用spring-instrument的项目没有这个文件。 我认为问题是 Jacoco 希望使用asm的{​​{1}},但它失败了(但我不确定我是对的)。

Jacoco 版本为spring-instrument

为什么 Jacoco 在这种情况下无法检测? 我怎么能克服这个?

我想也许我可以配置 maven-compiler-plugin 将代码编译为1.6然后我不需要 maven-surefire-plugin 插件。它有意义吗?

2 个答案:

答案 0 :(得分:3)

由Jacoco Maven插件定义的argLine值正在被Surefire插件重写。

在“jacoco-maven-plugin”配置中设置属性名称,如下所示:

<propertyName>coverageAgent</propertyName>

然后在您的surefire插件配置中编辑argLine,以便它包含Jacoco的代理:

<argLine>
    -XX:-UseSplitVerifier
    ${coverageAgent} 
    -javaagent:${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar
</argLine>

请注意,Jacoco的代理人被放置在Spring的乐器之前。这就是应该这样做的原因,因为Jacoco在处理修改后的字节码时遇到了问题(例如,由AspectJ LTW生成的字节码)。

实际上,即使作为第一个代理人,Jacoco的报告仍然可能是错误的,但问题通常仅限于一小部分情况(例如http://sourceforge.net/p/eclemma/discussion/614869/thread/3d875388)。

答案 1 :(得分:2)

我的猜测是JaCoCo也使用java命令行,因为它可能是作为javaagent实现的。

可能是spring-instrument javaagent覆盖了JaCoCo吗?