在JDK 1.7上使用Emma / Cobertura时出现java.lang.VerifyError错误

4

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

Testng、Emma、Cobertura、覆盖率和JDK 7导致ClassFormatError和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"

或者

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"

.....


这个链接非常有用,可以帮助理解Java 7和Tomcat 6/7中出现的java.lang.VerifyError问题的根本原因。 - Learner
1个回答

3

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

$ export JAVA_OPTIONS="-Xverify:none"  # or other verification-disabling options

1
非常感谢您的回复。我已经通过在构建文件中设置JAVA_OPTS变量来解决了这个问题.....ENV ['JAVA_OPTS'] || =“-Xverify:none” - Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接