获得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出现故障。
任何想法在哪里可能会有所帮助。

回答:

 当您针对不同于在运行时使用的库进行编译时,java.lang.VerifyError可以是结果。
例如,当我尝试运行一个针对Xerces 1编译的程序时,这发生在我身上,但Xerces 2在类路径中被发现。所需的类(在org.apache.*命名空间中)在运行时被发现,所以ClassNotFoundException的结果。对类和方法进行了更改,因此在运行时找到的方法签名与编译时不符。
通常,编译器将标记方法签名不匹配的问题。当加载类时,JVM将再次验证字节码,并且当字节码尝试执行不应允许的事件时,引发VerifyError。调用返回String的方法,然后将该返回值存储在保存List的字段中

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Reasons of getting a java.lang.VerifyError

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 + 3 =