Jer*_*eur 188 java deployment exception 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)
Run Code Online (Sandbox Code Playgroud)
它在启动部署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)
Run Code Online (Sandbox Code Playgroud)
您可以看到显示更多的方法签名.
实际的方法签名是
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
Run Code Online (Sandbox Code Playgroud)
我已经尝试过用它来查看它,javap并给出了应该的方法签名.
当我的其他同事检查代码,编译并部署它们时,它们会遇到同样的问题.当构建服务器获取代码并将其部署在开发或测试环境(HPUX)上时,会发生同样的错误.此外,运行Ubuntu的自动测试机在服务器启动期间显示相同的错误.
应用程序的其余部分运行正常,只有一个servlet出现故障.任何想看的地方都会有所帮助.
Kev*_*nko 184
java.lang.VerifyError 当您针对不同的库编译时,可能是您在运行时使用的结果.
例如,当我尝试运行针对Xerces 1编译的程序时发生了这种情况,但在类路径中找到了Xerces 2.所需的类(在org.apache.*命名空间)在运行时被发现,所以ClassNotFoundException是没有结果.类和方法已经发生了变化,因此在运行时找到的方法签名与编译时的方法签名不匹配.
通常,编译器将标记方法签名不匹配的问题.JVM将在加载类时再次验证字节码,并VerifyError在字节码尝试执行不应允许的操作时抛出- 例如调用返回的方法,String然后将该返回值存储在包含a的字段中List.
p3t*_*t0r 20
java.lang.VerifyError 是最糟糕的.
如果方法的字节码大小超过64kb限制,则会出现此错误; 但你可能已经注意到了.
您是否100%确定此类在应用程序的其他位置的类路径中不存在,可能在另一个jar中?
另外,从您的堆栈跟踪,是源文件的字符编码(utf-8?)这是正确的吗?
我通过制作我导入库的项目在Android上修复了这个错误,如此处所述http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
以前,我只是引用该项目(没有使它成为一个库),我得到了这个奇怪的VerifyError.
希望它可以帮助某人.
您可能尝试的一件事是使用-Xverify:all哪个将在加载时验证字节码,如果字节码无效,有时会提供有用的错误消息.
VerifyError意味着类文件包含语法正确但违反某些语义限制的字节码,例如跨越方法边界的跳转目标.
基本上,只有在存在编译器错误时,或者当类文件以某种其他方式损坏时(例如,通过故障RAM或故障HD),才会发生VerifyError.
尝试使用不同的JDK版本和不同的计算机进行编译.
在我的情况下,我的Android项目依赖于为Java 7编译的另一个Java项目java.lang.VerifyError在我将该Java项目的编译器合规性级别更改为6.0后消失了
后来我发现这是一个Dalvik问题:https://groups.google.com/forum/ ? fromgroups#!topic / android-Developers/sKsMTZ42pwE