204

我正在调查以下内容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 出现故障。任何在哪里寻找的想法都会有所帮助。

4

25 回答 25

200

java.lang.VerifyError当您针对与运行时使用的库不同的库进行编译时,可能会出现结果。

例如,当我尝试运行针对 Xerces 1 编译的程序时发生了这种情况,但在类路径中找到了 Xerces 2。所需的类(在org.apache.*命名空间中)是在运行时找到的,所以不是ClassNotFoundException结果。类和方法发生了变化,因此在运行时找到的方法签名与编译时的签名不匹配。

通常,编译器会标记方法签名不匹配的问题。JVM 将在加载类时再次验证字节码,并VerifyError在字节码尝试执行不应允许的操作时抛出异常——例如调用返回的方法,String然后将该返回值存储在包含List.

于 2010-03-25T17:40:48.603 回答
23

java.lang.VerifyError是最糟糕的。

如果您的方法的字节码大小超过 64kb 限制,您将收到此错误;但你可能已经注意到了。

您是否 100% 确定该类不存在于应用程序其他地方的类路径中,也许在另一个 jar 中?

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

于 2008-09-19T06:58:14.873 回答
11

正如 Kevin Panko 所说,这主要是因为图书馆的变化。因此,在某些情况下,对项目(目录)进行“清理”,然后进行构建就可以了。

于 2011-03-03T17:15:01.930 回答
9

您可能会尝试的一件事是使用-Xverify:all它将验证加载时的字节码,如果字节码无效,有时会提供有用的错误消息。

于 2008-09-19T12:14:03.297 回答
8

VerifyError 意味着类文件包含语法正确但违反某些语义限制的字节码,例如跨越方法边界的跳转目标。

基本上,VerifyError 只会在存在编译器错误或类文件以其他方式损坏(例如,通过有故障的 RAM 或故障的 HD)时发生。

尝试在不同的机器上使用不同的 JDK 版本进行编译。

于 2010-01-11T12:13:20.720 回答
8

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

以前,我只是在引用该项目(而不是使它成为一个库)并且我得到了这个奇怪的 VerifyError。

希望它可以帮助某人。

于 2012-12-13T00:17:57.220 回答
5

在我的情况下,我的 Android 项目依赖于为 Java 7 编译的另一个 Java 项目。java.lang.VerifyError在我将该 Java 项目的编译器合规级别更改为 6.0 后消失了

后来我发现这是一个 Dalvik 问题:https ://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE

于 2013-05-19T11:14:51.830 回答
4

由于 pack200 修改了类文件,我遇到了这个问题。稍微搜索一下就发现了这个java 错误。基本上,设置--effort=4导致问题消失。

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

于 2009-05-27T21:03:35.820 回答
3

我通过替换修复了类似的 java.lang.VerifyError 问题

        catch (MagickException e)

        catch (Exception e)

whereMagickException在库项目中定义(我的项目依赖于该项目)。

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

于 2013-04-17T12:37:16.643 回答
3

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

这是Ning Async HTTP 客户端的问题。

于 2013-05-10T09:22:57.773 回答
2

在我的情况下,我不得不删除这个块:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

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

于 2014-04-27T16:19:19.837 回答
2

产生错误的最小示例

一种简单的可能性是使用Jasmin,或者使用二进制文件编辑器手动编辑字节码。

让我们创建void没有return指令的方法(由return;Java 中的语句生成),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 编译器为我们添加了隐式return方法void。这就是我们不需要在方法中添加 areturn的原因main。您可以使用javap.

虚拟机

当您尝试运行JVMS 7 第 4.5 章指定的某些类型的非法类文件时,会发生 VerifyError

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

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

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

因此,要查看最小故障示例,我们需要生成不带javac.

于 2015-04-06T12:49:28.223 回答
1

这个页面可能会给你一些提示 - http://www.zanthan.com/itymbi/archives/000337.html

该方法的主体中可能存在 javac 未能发现的细微错误。除非您在此处发布整个方法,否则很难诊断。

您可以从声明尽可能多的变量作为 final 开始......这将捕获 zanthan 网站上提到的错误,并且通常是一个很好的做法。

于 2008-09-19T06:57:23.567 回答
1

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

于 2013-07-31T15:03:54.763 回答
1

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

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

于 2014-05-02T20:47:59.460 回答
1

此错误的另一个原因可能是 AspectJ <= 1.6.11 与 JRE > 6 的组合。

有关详细信息,请参阅Eclipse 错误 353467Kieker 票证 307

当在 JRE 6 上一切正常并且迁移到 JRE7 时,情况尤其如此。

于 2014-09-18T01:26:20.347 回答
1

CGLIB < 2.2 with JRE > 6 可能会触发类似的错误,请参阅“我应该升级到 CGLIB 3.0 吗?” 以及Spring SPR-9669上的一些评论。

当在 JRE 6 上一切正常并且简单地切换到 JRE7 时,情况尤其如此。

于 2014-09-18T01:30:11.307 回答
1

当您使用 maven 导入大量模块时,也可能发生这种情况。将有两个或多个类具有完全相同的名称(相同的限定名称)。此错误是由编译时和运行时之间的解释差异引起的。

于 2015-05-04T12:09:09.383 回答
1

如果您正在迁移到 java7 或使用 java7,那么通常可以看到此错误。我遇到了上述错误并努力找出根本原因,我建议在运行应用程序时尝试添加“-XX:-UseSplitVerifier” JVM 参数。

于 2016-02-16T05:57:46.450 回答
1

GradleAndroid Studio 3.6.1中更新后,API 19 在发布版本中发生了崩溃。

出现Glide错误。解决方案是重写proguard-rules.txt

也可以降级Gradleclasspath 'com.android.tools.build:gradle:3.5.3'),但它是一个过时的解决方案,不要使用它。

于 2020-03-04T16:21:24.787 回答
0

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

  1. 检查cglibs我的类路径。
  2. 检查hibernate我的类路径中的版本。

拥有上述任何一个版本的多个或冲突版本很可能会导致像所讨论的问题一样的意外问题。

于 2014-12-24T17:13:17.443 回答
0

java.lang.VerifyError 表示您编译的字节码指的是 Android 找不到的东西。此 verifyError 仅向我发出 kitkat4.4 和较小版本的问题,即使我在两个设备中运行相同的版本,也不在上述版本中。当我使用旧版本的杰克逊 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.+'

然后我将 Dependancy 更改为没有核心库的最新版本 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'
于 2016-02-18T12:20:56.913 回答
0

请删除任何不可用的 jar 文件并尝试运行。及其对我的工作我添加了一个 jcommons jar 文件和另一个 jcommons.1.0.14 jar 文件,因此删除 jcommons 及其为我工作

于 2017-12-27T10:07:10.450 回答
0

写在文件上:

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

接下来进入依赖项:<module name="sun.jdk"/>

于 2019-09-09T16:52:27.520 回答
-2

就我而言,我在下面的堆栈跟踪中遇到了验证错误

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 附带的版本不匹配。

于 2018-01-04T04:50:12.263 回答