获取java.lang.VerifyError的原因

获取java.lang.VerifyError的原因

我正在调查以下情况java.lang.VerifyError

java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature:
 (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/
 util/MessageRe˜̴MtÌ´MÚw€mçw€mp:”MŒŒ
                at java.lang.Class.getDeclaredConstructors0(Native Method)
                at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
                at java.lang.Class.getConstructor0(Class.java:2671)

当启动部署servlet的JBOSS服务器时,就会发生这种情况。它是用JDK-1.5.0_11编译的,我尝试用JDK-1.5.0_15重新编译它,但没有成功。也就是说,编译运行良好,但部署时会出现java.lang.VerifyError。

当我更改方法名并得到以下错误时:

java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: 
(IILjava/util/Collection;Lj    ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util
/MessageResources ØÅN|ØÅNÚw€mçw€mX#ÖM|XÔM
            at java.lang.Class.getDeclaredConstructors0(Native Method)
            at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
            at java.lang.Class.getConstructor0(Class.java:2671)
            at java.lang.Class.newInstance0(Class.java:321)
            at java.lang.Class.newInstance(Class.java:303)

您可以看到,显示了更多的方法签名。

实际的方法签名是

  private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
                          Collection calendarDays,
                          HashMap bcSpecialDays,
                          Collection activityPeriods,
                          Locale locale, MessageResources resources) throws   Exception {

我已经试着用javap这给了这个方法应有的签名。

当我的其他同事签出、编译和部署代码时,他们也会遇到同样的问题。当构建服务器获取代码并在开发或测试环境(HPUX)上部署代码时,也会发生相同的错误。此外,运行Ubuntu的自动测试机器在服务器启动期间也会显示相同的错误。

应用程序的其余部分运行正常,只有一个servlet出现故障。任何去哪找的想法都会有帮助。


牛魔王的故事
浏览 2225回答 3
3回答

慕桂英4014372

java.lang.VerifyError可能是针对运行时使用的不同库进行编译时的结果。例如,当我试图运行一个针对Xerces 1编译的程序时,我遇到了这种情况,但是在类路径上找到了Xerces 2。所需的类(在org.apache.*命名空间)在运行时找到,因此ClassNotFoundException曾.不结果。对类和方法进行了更改,因此在运行时找到的方法签名与编译时的方法签名不匹配。通常,编译器将标记方法签名不匹配的问题。在装入类时,jvm将再次验证字节码,并抛出VerifyError当字节码试图做一些不应该允许的事情时-例如调用返回的方法String,然后将返回值存储在包含List.

幕布斯7119047

java.lang.VerifyError是最糟糕的。如果您的方法的字节码大小超过了64 KB的限制,您将得到此错误;但是您可能已经注意到了这一点。您是否100%确定这个类不存在于应用程序其他地方的类路径中,可能在另一个JAR中?此外,在您的堆栈跟踪中,是源文件的字符编码(utf-8?)这是对的吗?

哔哔one

正如凯文·潘科所说,这主要是因为图书馆的变化。因此,在某些情况下,一个“干净”的项目(目录)和一个构建完成了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java