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

标签 java maven code-coverage java-7 jacoco

由于我在 Java 7 中使用 cobertura 时遇到了一些问题 - 我正在尝试 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 希望使用 spring-instrumentasm 但它失败了(但我不确定我是右)。

Jacoco版本为0.6.3.201306030806

为什么Jacoco在这种情况下无法检测? 我该如何克服这个问题?

我想也许我可以配置maven-compiler-plugin将代码编译到1.6,然后我就不需要maven-surefire-plugin插件了。有道理吗?

最佳答案

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 的 Instrument 之前。这就是应该这样做的方式,因为 Jacoco 在处理修改后的字节码(例如 AspectJ LTW 生成的字节码)时遇到问题。

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

关于java - 如何使用 Java 7 和 spring-instrument 运行 Jacoco?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187029/

相关文章:

java - 当单元测试覆盖率低于多模块项目中预先配置的限制时,maven 构建失败

java - 在 UiApplication 中使用 invokeLater( )

java - 有关 Intellij 中的基本类,请参阅 Javadocs

maven - Gradle-从FTP检索 Artifact

java - 无法使用Tomcat和Maven的tomcat7-websocket插件启动WebSocket容器

c# - 如何排除类型和方法不被 TeamCity 中的 dotCover 覆盖?

Jenkins 三叶草 REST API

java - 将数据添加到文件

java - 当我们使用 synchronized 关键字时,什么被锁定了?

java - 如何在 Intellij 中获取文件?