得到java.lang.VerifyError的原因


191

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


1
我是通过使用错误版本的CompareFailure获得的。永远找来...那很痛苦
Tim Boland

1
我在Android Studio中使用即时运行时获得了它(编译时进行热交换)。关闭它可以完成这项工作。
Serge

Answers:


188

java.lang.VerifyError 针对与运行时使用的库不同的库进行编译时,可能会出现这种情况。

例如,在尝试运行针对Xerces 1编译的程序但在类路径中找到Xerces 2时,这发生在我身上。所需的类(在org.apache.*命名空间)在运行时被发现,所以ClassNotFoundException没有结果。对类和方法进行了更改,以便在运行时找到的方法签名与编译时不匹配。

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


3
要添加的一件事,有时是IDE的错误,或者设备的字节码不正确。尝试重新启动IDE,使其能够识别同步问题。未能删除并重新安装该应用程序。重新启动设备也可能会有所帮助。
ima747 2014年

2
要找出哪个类是罪魁祸首,请添加VM参数-verbose:class,然后在加载类之前查找该类java.lang.VerifyError。这将具有通往JAR的路径。使用javap和比较,对类正在编译反对。我发现这很有用,因为错误中报告的类并非实际上是参数之一的原因。
steinybot '16

21

java.lang.VerifyError 是最糟糕的

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

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

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


我确定它不在其他地方。它是43Kb,仍然是一个很大的类。
Jeroen Wyseur,

在我的情况下,感谢您的帖子,它是一种不同的编码:JasperReports XMl文件保存了编码和Java版本,您必须根据项目设置(通过iReport)进行相应设置。这就是问题所在,感谢您对编码的想法!:)
Tobias

这是我的android测试问题,对其进行了多义修复。
Prakash Nadar

10

正如Kevin Panko所说,这主要是因为图书馆的变化。因此,在某些情况下,先对项目(目录)进行“清理”,再进行构建即可解决问题。


9

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



8

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

基本上,VerifyError仅在存在编译器错误或类文件以其他某种方式损坏(例如,通过错误的RAM或HD失败)时发生。

尝试使用其他JDK版本和其他计算机进行编译。


5

就我而言,我的Android项目依赖于为Java 7编译的另一个Java项目。java.lang.VerifyError在将该Java项目的Compiler Compliance Level更改为6.0之后消失了。

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


1
Dalvik只是Java6的分支版本,因此没有Java7功能可用!
Jeroen Wyseur

4

由于pack200处理了一个类文件,我遇到了这个问题。进行一些搜索后发现此Java错误。基本上,设置--effort=4导致问题消失。

使用Java 1.5.0_17(尽管在我尝试过的Java 1.5的每个单个变体中都出现了)。


3

我已经通过替换解决了类似的java.lang.VerifyError问题

        catch (MagickException e)

        catch (Exception e)

其中,MagickException在库项目定义(上我的项目具有相关性)。

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


1
这对我有用...我真的很想找出错误,除了“用一揽子例外代替我,我会工作”之外。
Alex Hart

@AlexHart适用于Android,但可能适用于企业Java的逻辑相同:stackoverflow.com/a/36814155/253468
TWiStErRob


2

就我而言,我必须删除此块:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

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


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编译器增加了一个隐含的returnvoid我们的方法。这就是为什么我们不需要在方法中添加a return的原因main。您可以使用进行检查javap

虚拟机

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

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

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

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

因此,要查看一个最小的故障示例,我们将需要生成不带的源代码javac


1

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

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

您可以首先声明尽可能多的变量,这些变量将最终捕获zanthan网站上提到的错误,并且无论如何通常都是一个好习惯。


1
那个家伙在2002年遇到了一个编译器错误,但此后此错误已得到修复。
凯文·潘科

1

在我的情况下,我的项目A依赖于另一个项目,例如X(A使用的是X中定义的某些类)。因此,当我在A的构建路径中将X添加为参考项目时,出现了此错误。但是,当我删除X作为参考项目并包括X的jar作为库之一时,问题就解决了。


1

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

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




1

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


1

如果要迁移到java7或使用java7,则通常可以看到此错误。我遇到上述错误,并且在寻找根本原因方面费了很多力气,建议您在运行应用程序时尝试添加“ -XX:-UseSplitVerifier” JVM参数。


1

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

发生Glide错误。解决方法是重写proguard-rules.txt

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


0

尽管凯文(Kevin)提到的原因是正确的,但在进行其他操作之前,我肯定会检查以下内容:

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

如果上述任何一个版本有多个或冲突的版本,可能会导致诸如上述问题之类的意外问题。


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,然后工作了。这意味着核心的方法和其他内容已迁移到最新版本的 Databind2.7。这解决了我的问题。

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

您如何知道要查找的JAR?
Siddharth

1
杰克逊核心:2.2。+已成为历史。因此,我们需要使用databind:2.7.0-rc3,annotations:2.7.0-rc3或最新版本。这2就足够了,避免使用jackson-core:2.2。+。到那时我遇到了一些verifyerror。而使用2.7或更高版本,它并没有显示错误
阿南德krish

0

请删除任何无法使用的jar文件,然后尝试运行。及其对我的工作我添加了一个jcommons jar文件以及另一个jcommons.1.0.14 jar文件,因此删除了jcommons及其对我有用



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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.