【问题标题】:How to run Jacoco with Java 7 and spring-instrument?如何使用 Java 7 和 spring-instrument 运行 Jacoco?
【发布时间】:2013-06-15 17:44:16
【问题描述】:

由于我在使用带有 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 插件了。有意义吗?

【问题讨论】:

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


    【解决方案1】:

    由 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)。

    【讨论】:

      【解决方案2】:

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

      会不会是 spring-instrument javaagent 覆盖了 JaCoCo 呢?

      【讨论】:

      • 我认为不是:[DEBUG] (s) argLine = -javaagent:C:\Users\noaml\.m2\repository\org\jacoco\org.jacoco.agent\0.6.3.201306030806\org.jacoco.agent-0.6.3.201306030806-runtime.jar=destfile=...\target\jacoco.exec
      • 那么也许是另一种方式 - jacoco 覆盖了 sprint 仪器的 java 代理,代码因此而无法运行?
      • 感谢重播 - 但这不太可能,在这种情况下测试根本不会通过......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2013-02-15
      • 2017-04-16
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多