Как запустить модульный тест в java 7: java.lang.VerifyError: Ожидается кадр карты стека в целевой ветви

Привет, я запускаю тест maven, используя maven 3.0.3 с окончательным выпуском hibernate 4.0.0 и spring 3.1 в jdk7 update 2.

Я получаю следующую ошибку.

Caused by: java.lang.VerifyError: Expecting a stackmap frame at branch target 63 in method ${myDomainClass}.equals(Ljava/lang/Object;)Z at offset 24
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
    at java.lang.Class.getDeclaredMethods(Class.java:1808)
    at org.hibernate.property.BasicPropertyAccessor.getterMethod(BasicPropertyAccessor.java:352)
    at org.hibernate.property.BasicPropertyAccessor.getGetterOrNull(BasicPropertyAccessor.java:331)
    at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:314)
    at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:310)
    at org.hibernate.internal.util.ReflectHelper.getter(ReflectHelper.java:250)
    at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:229)
    at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.java:314)
    at org.hibernate.cfg.HbmBinder.bindSimpleId(HbmBinder.java:447)
    at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:380)
    at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:320)
    at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:171)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3377)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3369)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3357)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1334)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)

Мой метод Equals использует EqualsBuilder из commons-lang 2.6. Я установил следующие параметры maven

SET MAVEN_OPTS=%MAVEN_OPTS% -XX:-UseSplitVerifier

после прочтения этого Java 7 JVM verifyError

Примечание. Мой тест работает под jdk 1.6 update 29.

Как я могу это исправить? Кажется, установка -XX:-UseSplitVerifier по-прежнему вызывает ошибку.


person Chun ping Wang    schedule 26.12.2011    source источник
comment
Я бы очистил и снова собрал весь проект и попробовал бы другую библиотеку commons-lang. Похоже на эту проблему: stackoverflow.com/a/8617057/1064325   -  person falsarella    schedule 20.01.2012
comment
Hibernate использует cglib, и в зависимости от того, как вы настроили Spring, он также может использовать аналогичные библиотеки, возможно, они могут быть виноваты. Попробуйте использовать более новую версию cglib в пути к классам и посмотрите, подходит ли она.   -  person Ustaman Sangat    schedule 21.01.2012


Ответы (2)


В соответствии с документацией плагина surefire MAVEN_OPTS не наследуются созданной JVM, поэтому вам нужно указать argLine параметр конфигурации с -XX:-UseSplitVerifier в элементе конфигурации maven-surefire-plugin.

person Eugene Kuleshov    schedule 06.02.2012
comment
Как это сделать с помощью Ant? Что я пробовал ‹jvmarg value=-XX:-UseSplitVerifier/›? Не работает. Я использую JDK6 u43 - person Arjun Thakur; 14.04.2013

Похоже, вы столкнулись с «улучшенным» верификатором байт-кода (который на самом деле тупой, так что он требует, чтобы компилятор предоставил гораздо больше информации о верификаторе). Вам нужно либо обработать свой код строкой компилятора, которая создает «улучшенный» формат байт-кода, либо установить для версии файла класса «старую» версию (которая, я думаю, будет чем-то меньше 50.0).

person Hot Licks    schedule 06.02.2012
comment
Проблема на самом деле не в пользовательском коде, а в инструментах/библиотеках, таких как Hibernate и CGLIB. Эти инструменты не знают о новых требованиях к байт-коду и, очевидно, плохо работают с классами, скомпилированными для Java 7. - person Eugene Kuleshov; 14.02.2012
comment
@EugeneKuleshov - Итак, какое решение вы предлагаете, кроме одного из двух, которые я предложил? - person Hot Licks; 14.02.2012
comment
Вот в чем дело. На самом деле вы не предложили решение проблемы с оригинальным плакатом, но сделали несколько оскорбительных замечаний о верификаторе байт-кода. - person Eugene Kuleshov; 15.02.2012
comment
Я предложил два решения: настроить строку компилятора для создания нового формата или ориентироваться на старую версию. По-видимому, исправление, которое было принято, использует первое из этих двух. То, что я сказал о верификаторе, не что иное, как правда. - person Hot Licks; 15.02.2012