获取java.lang.VerifyError的原因

时间:2008-09-19 06:49:18

标签: java exception deployment 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出现故障。 任何想看的地方都会有所帮助。

25 个答案:

答案 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.jjavap -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编译器为我们添加了隐式returnvoid方法。这就是我们不需要为return方法添加main的原因。您可以使用javap进行检查。

<强> JVMS

当您尝试运行JVMS 7 chapter 4.5

指定的某些类型的非法类文件时,会发生VerifyError

JVMS表示,当Java加载文件时,它必须运行一系列检查,以便在运行之前查看类文件是否正常。

在Java代码的单个编译和运行周期中无法生成此类错误,因为JVMS 7 4.10 says

  

即使Java编程语言的编译器必须只生成满足所有静态和结构约束的类文件[...]   ]

因此,要查看最小失败示例,我们需要生成不带javac的源代码。

答案 10 :(得分:2)

当您尝试加载针对Oracle JDK编译的库时,可能会在Android上发生这种情况。

对于Ning Async HTTP客户端,

Here is the problem

答案 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 353467Kieker 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发生崩溃。

有一个Glideerror。解决方法是重写proguard-rules.txt

也可以将Gradle降级(classpath 'com.android.tools.build:gradle:3.5.3'),但这是过时的解决方案,请不要使用它。

答案 20 :(得分:0)

虽然凯文提到的理由是正确的,但在转向别的东西之前我肯定会检查下面的内容:

  1. 检查我的类路径中的cglibs
  2. 检查我的类路径中的hibernate版本。
  3. 如果上述任何一种版本存在多个或相互矛盾的版本,可能会导致意外问题,例如相关问题。

答案 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的版本不匹配。