我正在调查以下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出了问题。 知道去哪里找会很有帮助。


当前回答

我在Android上修复了这个错误,通过使我导入一个库的项目,如http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject所述

以前,我只是引用项目(没有使它成为一个库),我得到这个奇怪的VerifyError。

希望它能帮助到别人。

其他回答

您可以尝试使用-Xverify:all,它将在加载时验证字节码,如果字节码无效,有时会给出有用的错误消息。

java.lang.VerifyError是最差的。

如果方法的字节码大小超过64kb限制,就会得到这个错误;但你可能已经注意到了。

您是否100%确定这个类不存在于应用程序的类路径中,比如在另一个jar中?

另外,从堆栈跟踪中,是源文件的字符编码(utf-8?)对吗?

在我的情况下,我必须删除这个块:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

在Fragment.showDialog()方法调用附近显示错误。

在我的例子中,我的项目A依赖于另一个项目,比如X(A使用了X中定义的一些类),所以当我在A的构建路径中添加X作为参考项目时,我得到了这个错误。然而,当我删除X作为引用项目,并将X的jar作为库之一时,问题就解决了。

在类路径上检查同一个jar文件的多个版本。

例如,我的类路径中有opennlp-tools-1.3.0.jar和opennlp-tools-1.5.3.jar,并得到了这个错误。解决方案是删除opennlp-tools-1.3.0.jar。