尝试使用 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 还没有 catch ......他们似乎已经更新了代码并提交现在掌握它..
https://github.com/cobertura/cobertura/pull/6
如何修复此错误?
Oracle 确实通过使用 -XX:UseSplitVerifier VM 选项提供了解决该问题的方法。
Apache 构建器:
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"
.....
最佳答案
Buildr 运行嵌入式 JVM(通常在不使用 JRuby 时使用 Ruby-Java Bridge (RJB))并从该 JVM 中执行测试选择,因此我建议在启动之前通过 JAVA_OPTIONS 传递验证禁用选项 buildr
:
$ export JAVA_OPTIONS="-Xverify:none" # or other verification-disabling options
关于java-7 - 在 JDK 1.7 上使用 emma/Cobertura 时出现 java.lang.VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16905947/