我正在调查以下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问题替换

        catch (MagickException e)

with

        catch (Exception e)

其中MagickException是在一个库项目中定义的(我的项目依赖于它)。

之后,我得到了一个java.lang.NoClassDefFoundError关于来自同一个库的类(根据https://stackoverflow.com/a/9898820/755804修复)。

其他回答

我得到这个问题,由于pack200 manging一个类文件。稍微搜索一下就找到了这个java错误。基本上,设置——effort=4可以解决问题。

使用java 1.5.0_17(尽管它出现在我尝试的每一个java 1.5变体中)。

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

写入文件:

{Wildfly-home}\modules\system\layers\base\org\picketbox\main 

接下来进入依赖项:<模块名称="sun.jdk"/>

verifyerror意味着你编译的字节码指向了Android无法找到的东西。这个verifyError问题我只与kitkat4.4和更低的版本,而不是在上面的版本,即使我在两个设备上运行相同的构建。当我使用老版本的jackson json解析器时,它显示java.lang.verifyerror

compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'

然后我将dependency更改为最新版本2.2到2.7,没有核心库,然后它就可以工作了。这意味着core的Methods和其他内容被迁移到Databind2.7的最新版本。这解决了我的问题。

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'

虽然Kevin提到的原因是正确的,但在转向其他内容之前,我肯定会检查以下内容:

检查类路径中的cglibs。 检查类路径中的hibernate版本。

有多个或冲突的上述任何一个版本可能会导致意想不到的问题,就像上面提到的那样。