java.lang.VerifyError при использовании emma/Cobertura в JDK 1.7

Я столкнулся с той же проблемой, упомянутой в приведенной ниже ссылке, при попытке создать сборку с использованием 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.

Сборщик Apache:

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"

.....


person Learner    schedule 03.06.2013    source источник
comment
dbknickerbocker.blogspot.com/2013/04/ ссылка была бы действительно полезной, чтобы понять основную причину этой проблемы.   -  person Learner    schedule 04.06.2013


Ответы (1)


Buildr запускает встроенную JVM (обычно с использованием моста Ruby-Java (RJB), когда JRuby не используется) и выполняет тестовый выбор внутри этой JVM, поэтому я бы предложил также передать параметры отключения проверки через JAVA_OPTIONS перед запуском buildr:

$ export JAVA_OPTIONS="-Xverify:none"  # or other verification-disabling options
person Alex Boisvert    schedule 03.06.2013
comment
Большое спасибо за ваш ответ. Я смог решить эту проблему, установив переменную JAVA_OPTS в файле сборки..... ENV['JAVA_OPTS'] ||= -Xverify:none - person Learner; 04.06.2013