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

标签 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 还没有 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/

相关文章:

java - 向前兼容 Java 6 注释处理器和 SupportedSourceVersion

java - 带有 MySQL 连接器的 Tomcat 7 : ASM ClassReader failed to parse class file

java - 你的代码覆盖率有多远?

java - 为什么 EclEmma 不涵盖 syncronized(MyClass.class)?

java - 如何在buildr中分解war文件

java - 构建允许在不同二进制文件之间共享模块的系统

java - 修复Java代码中的JRE错误并重新编译应用程序

android - Jacoco 将 coverage.ec 转换为没有 coverage.em 的报告

java - 所有 Java 构建工具都有什么用?

java - 编译错误 : "' < >' cannot be used with anonymous classes"