【问题标题】:How do I get unit test to run in java 7: java.lang.VerifyError: Expecting a stackmap frame at branch target如何让单元测试在 java 7 中运行:java.lang.VerifyError: Expecting a stackmap frame at branch target
【发布时间】:2012-01-28 02:48:57
【问题描述】:

您好,我正在使用带有休眠 4.0.0 最终版本的 maven 3.0.3 和 jdk7 更新 2 上的 spring 3.1 运行 maven 测试。

我收到以下错误。

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 仍然会导致错误。

【问题讨论】:

  • 我会再次清理并构建所有项目并尝试其他 commons-lang 库。好像有点像这个问题:stackoverflow.com/a/8617057/1064325
  • Hibernate 使用 cglib 并且取决于您如何设置 spring,它也可能使用类似的库,也许他们可能是罪魁祸首。尝试在你的类路径中使用更新版本的 cglib,看看是否满足。

标签: java equals spring-3 java-7 hibernate-4.x


【解决方案1】:

根据surefire plugin documentation,MAVEN_OPTS 不会被衍生的 JVM 继承,因此您需要在 maven-surefire-plugin 配置元素中使用 -XX:-UseSplitVerifier 指定 argLine 配置参数。

【讨论】:

  • 例如:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-XX:-UseSplitVerifier</argLine> </configuration> </plugin>
  • 如何使用 Ant 做到这一点?我试过 吗?不工作。我正在使用 JDK 6 u43
【解决方案2】:

您似乎与“改进的”字节码验证器发生冲突(实际上它被简化了,因此它需要编译器提供更多的验证器信息)。您需要通过生成“改进”字节码格式的编译器字符串处理您的代码,或者将类文件的版本设置为“旧”版本(我认为它会小于 50.0)。

【讨论】:

  • 问题其实不在于用户代码,而在于工具/库,比如Hibernate和CGLIB。这些工具不知道新的字节码要求,显然不能很好地与编译为 Java 7 的类一起工作。
  • @EugeneKuleshov -- 那么除了我建议的两个解决方案之一之外,您还提出什么解决方案?
  • 事情就是这样。你并没有真正为最初的发帖者问题提供解决方案,但很少对字节码验证器发表攻击性言论。
  • 我提供了两种解决方案——调整编译器字符串以生成“新”格式,或以“旧”版本为目标。显然,采用的修复使用了这两者中的第一个。我对验证者所说的不过是事实。
猜你喜欢
  • 2019-04-05
  • 2017-05-25
  • 2013-11-24
  • 2011-12-26
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多