4

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

Testng、Emma、Cobertura、coverage 和 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 选项确实提供了解决该问题的方法。

阿帕奇生成器:

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"

......

4

1 回答 1

3

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

$ export JAVA_OPTIONS="-Xverify:none"  # or other verification-disabling options
于 2013-06-03T22:09:57.603 回答