在JDK 1.7上使用emma / Cobertura时出现java.lang.VerifyError

时间:2013-06-03 21:14:28

标签: java-7 emma buildr

在尝试使用Apache Buildr创建构建时,我遇到了以下链接中提到的完全相同的问题。

Testng, Emma, Cobertura, coverage and JDK 7 result in ClassFormatError and VerifyError

我在测试工件时尝试使用-XX:-UseSplitVerifier选项(如下所示),但这不能解决我的问题。

  test.using( :java_args => ['-ea','-XX:-UseSplitVerifier'])

错误:

Instrumenting classes with emma metadata file /test-client/reports/emma/coverage.em
JavaTestFilter: Unable to load class com.test.activemq.QueueConsumerTest to determine testing ability

更新 - 解决方案/根本原因..

使用Java 1.7编译的代码需要堆栈映射帧指令。如果要修改Java 1.7类文件,则需要使用ClassWriter.COMPUTE_FRAMES或MethodVisit.visitFrame()。

java.lang.VerifyError - Java 7和Cobertura

我刚刚将Cobertura添加到Java 7项目中,并对我的单元测试开始失败感到失望:

 java.lang.VerifyError: Expecting a stackmap frame at branch target blah... 

看起来cobertura的字节代码检测与Java 7不兼容.Java 7改变了类格式,增加了用于验证的堆栈映射,而cobertura还没有赶上......他们似乎已经更新了代码并承诺现在掌握..

https://github.com/cobertura/cobertura/pull/6

如何解决此错误?

Oracle确实通过使用-XX:UseSplitVerifier VM选项解决了这个问题。

Apache Buildr:

ENV['JAVA_OPTS'] ||= "-XX:UseSplitVerifier"

OR

ENV['JAVA_OPTS'] ||= "-Xverify:none"

对于Maven:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <argLine>-XX:-UseSplitVerifier</argLine>
    </configuration>
</plugin>

对于Gradle:

test
 {     
  jvmArgs
"-XX:-UseSplitVerifier"

.....

1 个答案:

答案 0 :(得分:3)

Buildr运行嵌入式JVM(通常在不使用JRuby时使用Ruby-Java Bridge(RJB))并从该JVM中执行测试选择,因此我建议在启动之前通过JAVA_OPTIONS传递验证禁用选项{{1 }}:

buildr