java.lang.VerifyError:JVMVRFY012堆栈形状不一致;

时间:2015-09-28 11:21:29

标签: java websphere java-7 ibm-was

在WAS 8.5.5中部署Maven项目时出现以下错误。

我在WAS中安装了JDK 1.6和1.7。

  

错误500:org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常是java.lang.VerifyError:JVMVRFY012堆栈形状不一致; class = com / xyz / simtools / savings / jaxb / SavingsInput_JAXB_Deserialization_Stub,method = write(ILjava / lang / Object;)V,pc = 356

我注意到的事情:

  1. 在Tomcat,它运作良好
  2. 根据this在IBM JDK中有一些解决方法,但它仍然不适用于我
  3. 我尝试的事情:

    1. 尝试使用WAS中的两个JDK版本。
    2. 在IBM论坛
    3. 中阅读此link
    4. 在1.5和1.7中编译了我的项目并尝试部署
    5. 我错过了什么吗?我还需要处理其他任何变化吗?

2 个答案:

答案 0 :(得分:4)

我有同样的问题,但就我而言,问题和解决方案是另一回事。

(可能)原因: 我对问题原因的判断是同一API的两个版本实现之间的冲突。在设计时,在我的工作站(根据我所在地的既定规则),我的IDE使用IBM JDK实现的SAAJ 1.4来编译我的Web服务类。

IBM\jdk\jre\lib\rt.jar/com\sun\xml\internal\messaging\saaj\soap\SOAPDocumentImpl.class

运行时,使用Tomee(Tomcat)1.7.3,在整个路径中加载了相同的类:

$TOMEE_HOME\lib\saaj-impl-1.3.18.jar/com\sun\xml\internal\messaging\saaj\soap\SOAPDocumentImpl.class

这导致Web服务执行时出现验证错误:

  • java.lang.VerifyError:JVMVRFY012堆栈形状不一致;
  • (葡萄牙语): java.lang.VerifyError:JVMVRFY012 formato de pilha inconsistente;

解决方法 :只需将saaj-impl-1.3.18.jar从Tomee的lib文件夹中取出(移动它)。 由于Tomee / Tomcat使用与我的IDE相同的IBM JDK,我发现冲突可能是因为在Tomee的lib文件夹中本地化了saaj-impl-1.3.18.jar。离开那里,让Tomee在运行时使用在编译时使用的相同实现(IBM JDK)。

请注意我在开发工作站遇到此问题,而不是开发/生产(主机)环境。由于工作站配置文件的规则,这是我发现对我有用的解决方法。

答案 1 :(得分:1)

好吧终于我明白了..

分析:问题是由于“jaxb”依赖版本而发生的。在 我的一些依赖项目“jaxb”依赖项未包含在ivy.xml中...这使得编译器可以将JDK中存在的jaxb作为依赖项。但是在其他依赖项目中,“jaxb”依赖项在常春藤中使用某个版本明确定义...因此,依赖项目使用不同的jaxb版本进行编译,最终将通过“VerifyError”转换为jaxb。

解决方案:通过在ivy中为依赖项目添加“jaxb”版本来解决问题,这些项目没有明确地具有jaxb版本以及在主项目中作为Maven依赖项。