如何让unit testing在java 7中运行:java.lang.VerifyError:期望分支目标下的stackmap帧

嗨,我正在使用maven 3.0.3运行maven测试,使用hibernate 4.0.0最终版本和jdk7 update 2上的spring 3.1。

我收到以下错误。

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方法使用了commons-lang 2.6中的EqualsBuilder。 我设置了以下maven opts

 SET MAVEN_OPTS=%MAVEN_OPTS% -XX:-UseSplitVerifier 

在阅读了这个Java 7 JVM verifyError之后

注意:我的测试在jdk 1.6 update 29下运行。

我该如何解决? 似乎设置-XX:-UseSplitVerifier仍会导致错误。

根据surefire 插件文档, MAVEN_OPTS不会被生成的JVMinheritance,因此您需要在maven-surefire-plugin配置元素中使用-XX:-UseSplitVerifier指定argLine配置参数。

您似乎正在与“改进的”字节码validation程序(实际上是愚蠢的,因为它需要编译器提供更多的validation程序信息)相冲突。 您需要通过生成“改进的”字节码格式的编译器字符串处理代码,或者将类文件的版本设置为“旧”版本(我认为它将小于50.0)。