【问题标题】:java.lang.VerifyError: JVMVRFY012 stack shape inconsistent;java.lang.VerifyError: JVMVRFY012 堆栈形状不一致;
【发布时间】:2015-09-28 11:21:28
【问题描述】:
在 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
我注意到的事情:
- 在 Tomcat 中运行良好
- 根据 this 在 IBM JDK 中对此进行了一些修复,但它仍然不适合我
我尝试过的事情:
- 在 WAS 中尝试了两个 JDK 版本。
- 在 IBM 论坛中阅读 link
- 在 1.5 和 1.7 中编译了我的项目并尝试部署
我错过了什么吗?还有其他需要我注意的更改吗?
【问题讨论】:
标签:
java
websphere
java-7
ibm-was
【解决方案1】:
我有同样的问题,但在我的情况下,问题和修复是另一回事。
(可能的)原因:我对问题原因的判断是同一 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 格式不一致;
解决方法:只需将 saaj-impl-1.3.18.jar 从 Tomee 的 lib 文件夹中取出(移动它)。
由于 Tomee/Tomcat 使用与我的 IDE 相同的 IBM JDK,我发现冲突可能是因为 saaj-impl-1.3.18.jar 位于 Tomee 的 lib 文件夹中。离开那里,让 Tomee 在运行时使用与编译时相同的实现(IBM JDK)。
请注意,我在我的开发工作站上遇到了这个问题,不是开发/生产(主机)环境。由于工作站配置文件的规则,这是我发现对我有用的解决方法。
【解决方案2】:
好吧,我终于想通了..
分析:问题是由于“jaxb”依赖版本引起的。在
我的一些依赖项目“jaxb”依赖项未包含在 ivy.xml 中...这允许编译器将 JDK 中存在的 jaxb 作为依赖项。然而,在其他依赖项目中,“jaxb”依赖项在 ivy 中明确定义了一些版本......因此,依赖项项目使用不同版本的 jaxb 编译,最终将通过“VerifyError”wrt 到 jaxb。
解决方案:通过在 ivy 中为没有明确具有 jaxb 版本的依赖项项目以及在主项目中作为 Maven 依赖项添加“jaxb”版本来解决问题。