java.lang.VerifyError: JVMVRFY012 stack shape inconsistent;

java.lang.VerifyError: JVMVRFY012 stack shape inconsistent;

我在 WAS 8.5.5 中部署 Maven 项目时遇到以下错误。

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

Error 500: org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.VerifyError: JVMVRFY012 stack shape inconsistent; class=com/xyz/simtools/savings/jaxb/SavingsInput_JAXB_Deserialization_Stub, method=write(ILjava/lang/Object;)V, pc=356

我注意到的事情:

  1. 在 Tomcat 中,它工作正常
  2. 根据 this,IBM JDK 对此进行了一些修复,但它仍然对我不起作用

我尝试过的事情:

  1. 在 WAS 中尝试了两个 JDK 版本。
  2. 在 IBM 论坛
  3. 中阅读此link
  4. 在 1.5 和 1.7 中编译我的项目并尝试部署

我错过了什么吗?我需要注意的任何其他更改吗?

好吧,我终于想通了..

分析:"jaxb"依赖版本问题。在 我的一些依赖项项目 "jaxb" 依赖项未包含在 ivy.xml 中...这允许编译器将 JDK 中存在的 jaxb 作为依赖项。然而,在其他依赖项项目中,"jaxb" 依赖项在 ivy 中明确定义了一些版本...因此,依赖项项目是使用不同版本的 jaxb 编译的,最终将通过 "VerifyError" wrt 到 jaxb。

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

我遇到了同样的问题,但就我而言,问题和修复是另一回事。

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

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

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

$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 格式不一致;

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

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