我正在调查以下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出现故障。 任何想看的地方都会有所帮助。
答案 0 :(得分:181)
java.lang.VerifyError
可能是您在运行时使用的结果。
例如,当我尝试运行针对Xerces 1编译的程序时发生了这种情况,但在类路径中找到了Xerces 2。在运行时找到了所需的类(在org.apache.*
名称空间中),因此ClassNotFoundException
不 结果。对类和方法进行了更改,因此在运行时找到的方法签名与编译时的方法签名不匹配。
通常,编译器会标记方法签名不匹配的问题。 JVM将在加载类时再次验证字节码,并在字节码尝试执行不应允许的操作时抛出VerifyError
- 例如调用返回String
的方法,然后将该返回值存储在包含List
的字段中。
答案 1 :(得分:20)
java.lang.VerifyError
是最糟糕的。
如果方法的字节码大小超过64kb限制,则会出现此错误;但你可能已经注意到了。
您是否100%确定此类在应用程序的其他位置的类路径中不存在,可能在另一个jar中?
另外,从您的堆栈跟踪中,是源文件的字符编码(utf-8
?)这是正确的吗?
答案 2 :(得分:10)
Kevin Panko说,这主要是因为图书馆的变化。 因此,在某些情况下,项目(目录)的“干净”后跟构建就可以了。
答案 3 :(得分:8)
我通过制作导入库的项目在Android上修复了此错误,如此处所述http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
以前,我只是引用了这个项目(没有把它变成一个库)而且我得到了这个奇怪的VerifyError。
希望它有所帮助。
答案 4 :(得分:7)
您可能尝试的一件事是使用-Xverify:all
来验证加载时的字节码,如果字节码无效,有时会提供有用的错误消息。
答案 5 :(得分:7)
VerifyError意味着类文件包含语法正确但违反某些语义限制的字节码,例如:跨越方法边界的跳转目标。
基本上,只有在存在编译器错误时,或者当类文件以其他方式损坏时(例如,通过有故障的RAM或发生故障的HD),才会发生VerifyError。
尝试使用不同的JDK版本和不同的计算机进行编译。
答案 6 :(得分:5)
在我的情况下,我的Android项目依赖于为Java 7编译的另一个Java项目。java.lang.VerifyError
在我将该Java项目的编译器合规性级别更改为6.0后消失了
后来我发现这是一个Dalvik问题:https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE
答案 7 :(得分:4)
由于pack200修改了一个类文件,我遇到了这个问题。一点点搜索使java bug向上转。基本上,设置--effort=4
会导致问题消失。
使用java 1.5.0_17(虽然它在java 1.5的每一个变体中都出现了,我试过了。)
答案 8 :(得分:2)
在我的情况下,我不得不删除此块:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
Fragment.showDialog()
方法调用附近显示错误。
答案 9 :(得分:2)
生成错误的最小示例
一种简单的可能性是使用Jasmin,或者使用二进制文件编辑器手动编辑字节码。
允许创建void
方法而不使用return
指令(由Java中的return;
语句生成),JVMS认为这是非法的。
在Jasmin,我们可以写:
.class public Main
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
aload_0 ; Just so that we won't get another verify error for empty code.
.end method
然后我们javac Main.j
和javap -v Main
表示我们编译了:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
所以真的没有回复指示。
现在,如果我们尝试运行java Main
,我们就会得到:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: (class: NoReturn, method: main signature: ([Ljava/lang/String;)V) Falling off the end of the code
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
此错误在Java中永远不会发生,因为Java编译器为我们添加了隐式return
到void
方法。这就是我们不需要为return
方法添加main
的原因。您可以使用javap
进行检查。
<强> JVMS 强>
当您尝试运行JVMS 7 chapter 4.5
指定的某些类型的非法类文件时,会发生VerifyErrorJVMS表示,当Java加载文件时,它必须运行一系列检查,以便在运行之前查看类文件是否正常。
在Java代码的单个编译和运行周期中无法生成此类错误,因为JVMS 7 4.10 says:
即使Java编程语言的编译器必须只生成满足所有静态和结构约束的类文件[...] ]
因此,要查看最小失败示例,我们需要生成不带javac
的源代码。
答案 10 :(得分:2)
当您尝试加载针对Oracle JDK编译的库时,可能会在Android上发生这种情况。
对于Ning Async HTTP客户端,答案 11 :(得分:2)
我通过替换
修复了类似的java.lang.VerifyError问题 catch (MagickException e)
与
catch (Exception e)
其中MagickException
在库项目中定义(我的项目具有依赖项)。
之后我得到了一个java.lang.NoClassDefFoundError
来自同一个库的类(根据https://stackoverflow.com/a/9898820/755804修复)。
答案 12 :(得分:1)
在我的情况下,我的项目A依赖于另一个,比如说X(A使用了X中定义的一些类)。所以当我在A的构建路径中添加X作为参考项目时,我收到了这个错误。但是,当我删除X作为引用项目并将X的jar作为库之一时,问题就解决了。
答案 13 :(得分:1)
此页面可能会给您一些提示 - http://www.zanthan.com/itymbi/archives/000337.html
javac无法发现该方法的正文中可能存在一个微妙的错误。除非你在这里发布整个方法,否则很难诊断。
你可以首先声明尽可能多的变量作为最终......将会抓住zanthan网站上提到的bug,并且通常是一种很好的做法。
答案 14 :(得分:1)
检查类路径上相同jar文件的多个版本。
例如,我的classpath上有opennlp-tools-1.3.0.jar和opennlp-tools-1.5.3.jar,但是出现了这个错误。解决方案是删除opennlp-tools-1.3.0.jar。
答案 15 :(得分:1)
此错误的另一个原因可能是AspectJ&lt; = 1.6.11与JRE&gt;的组合。 6。
有关详细信息,请参阅Eclipse Bug 353467和Kieker ticket 307。
当JRE 6上的一切正常并且转移到JRE7会破坏事情时尤其如此。
答案 16 :(得分:1)
CGLIB&lt; 2.2用JRE&gt; 6可能会触发类似的错误,请参阅"Should I upgrade to CGLIB 3.0?"以及Spring SPR-9669处的一些评论。
当JRE 6上的所有工作正常并且只是切换到JRE7会破坏事情时,尤其如此。
答案 17 :(得分:1)
当您使用maven进行大量模块导入时,也可能发生这种情况。 将有两个或更多个具有完全相同名称的类(相同的限定名称)。 此错误是由编译时和运行时之间的解释差异引起的。
答案 18 :(得分:1)
如果要迁移到java7或使用java7,则通常可以看到此错误。我遇到了上述错误并且经常努力找出根本原因,我建议在运行应用程序时尝试添加“ - XX:-UseSplitVerifier” JVM参数。
答案 19 :(得分:1)
在 Android Studio 3.6.1 中更新Gradle
后,版本19中的API 19发生崩溃。
有一个Glide
库error。解决方法是重写proguard-rules.txt。
也可以将Gradle
降级(classpath 'com.android.tools.build:gradle:3.5.3'
),但这是过时的解决方案,请不要使用它。
答案 20 :(得分:0)
虽然凯文提到的理由是正确的,但在转向别的东西之前我肯定会检查下面的内容:
cglibs
。 hibernate
版本。如果上述任何一种版本存在多个或相互矛盾的版本,可能会导致意外问题,例如相关问题。
答案 21 :(得分:0)
java.lang.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.+'
然后我在没有核心库的情况下将依赖性更改为最新版本2.2到2.7 ,然后它就可以了。这意味着核心的方法和其他内容将迁移到 Databind2.7 的最新版本。这解决了我的问题。
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
答案 22 :(得分:0)
请删除任何无法使用的jar文件并尝试运行。它为我工作我添加了一个jcommons jar文件和另一个jcommons.1.0.14 jar文件,所以删除jcommons及其为我工作
答案 23 :(得分:0)
写在文件上
{Wildfly-home}\modules\system\layers\base\org\picketbox\main
进入依赖关系:<module name="sun.jdk"/>
答案 24 :(得分:-1)
在我的情况下,我收到了以下堆栈跟踪的验证错误
jasperreports-server-cp-6.4.0-bin\buildomatic\build.xml:61: The following error occurred while executing this line:
TIB_js-jrs-cp_6.4.0_bin\jasperreports-server-cp-6.4.0-bin\buildomatic\bin\setup.xml:320: java.lang.VerifyError: (class: org/apache/commons/codec/binary/Base64OutputStream, method: <init> signature: (Ljava/io/OutputStream;ZI[B)V) Incompatible argument to function
at com.jaspersoft.jasperserver.crypto.KeystoreManager.createKeystore(KeystoreManager.java:257)
at com.jaspersoft.jasperserver.crypto.KeystoreManager.init(KeystoreManager.java:224)
at com.jaspersoft.buildomatic.crypto.KeystoreTask.execute(KeystoreTask.java:64)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:169)
at org.apache.tools.ant.taskdefs.ImportTask.importResource(ImportTask.java:222)
at org.apache.tools.ant.taskdefs.ImportTask.execute(ImportTask.java:163)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:180)
at org.apache.tools.ant.ProjectHelper.configureProject(ProjectHelper.java:93)
at org.apache.tools.ant.Main.runBuild(Main.java:826)
at org.apache.tools.ant.Main.startAnt(Main.java:235)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
我通过删除commons-codec-1.3.jar的类路径条目解决了这个问题,这个jar的版本与Jasper的版本不匹配。