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)

서블릿이 배포 된 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를 실행하는 자동 테스트 시스템은 서버 시작 중 동일한 오류를 보여줍니다.

나머지 응용 프로그램은 정상적으로 실행되며 하나의 서블릿 만 고장입니다. 어디를 보아도 도움이 될 것입니다.


1
잘못된 버전의 ComparisonFailure를 사용하여 얻었습니다. 영원히 찾기 위해 노력했다 ... 그것은 고통 스러웠다
Tim Boland

1
Android 스튜디오에서 즉시 실행 (컴파일시 핫스왑)을 사용할 때 얻었습니다. 전원을 끄면 작업이 완료되었습니다.
Serge

답변:


188

java.lang.VerifyError 런타임에 사용중인 라이브러리와 다른 라이브러리에 대해 컴파일 한 경우 결과가 될 수 있습니다.

예를 들어, 이것은 Xerces 1에 대해 컴파일 된 프로그램을 실행하려고 할 때 발생했지만 Xerces 2는 클래스 경로에서 발견되었습니다. org.apache.*네임 스페이스 에서 필수 클래스 가 런타임에 발견되었으므로 결과 ClassNotFoundException아닙니다 . 클래스와 메소드가 변경되어 런타임시 발견 된 메소드 서명이 컴파일시 있던 것과 일치하지 않았습니다.

일반적으로 컴파일러는 메소드 서명이 일치하지 않는 문제를 표시합니다. JVM은 클래스가로드 될 때 바이트 코드를 다시 확인하고 바이트 VerifyError코드가 허용되지 않아야하는 작업을 시도 할 때 (예 :을 반환 String하는 필드에 반환 값을 저장 한 메서드 호출) 호출 합니다 List.


3
한 가지 추가해야 할 것은 때로는 IDE의 결함이거나 바이트 코드가 올바르지 않은 장치입니다. 동기화 문제를 인식하도록 IDE를 다시 시작하십시오. 앱을 삭제하고 다시 설치하지 못했습니다. 장치를 재부팅하면 도움이 될 수 있습니다.
ima747

2
어떤 클래스가 범인인지 확인하려면 VM 인수를 추가 -verbose:class한 다음로드 직전에 클래스를 찾으십시오 java.lang.VerifyError. 여기에는 JAR 경로가 있습니다. javap이것을 컴파일하고 사용 하는 클래스와 비교 하십시오 . 오류로보고 된 클래스가 실제로 인수 중 하나 인 원인이 아니기 때문에 이것이 유용하다는 것을 알았습니다.
steinybot

21

java.lang.VerifyError 최악입니다.

메소드의 바이트 코드 크기가 64kb 제한을 초과하면이 오류가 발생합니다. 그러나 당신은 아마 그것을 알아 차렸을 것입니다.

이 클래스가 응용 프로그램의 다른 경로, 다른 항아리에 클래스 경로에 있지 않다고 100 % 확신합니까?

또한 스택 추적에서 소스 파일의 문자 인코딩 ( utf-8?)이 맞습니까?


나는 그것이 다른 곳에 존재하지 않을 것이라고 확신한다. 43Kb인데 여전히 큰 클래스입니다.
Jeroen Wyseur

그 게시물에 감사드립니다. 제 경우에는 다른 인코딩이었습니다. JasperReports XMl 파일은 인코딩과 Java 버전을 저장합니다 (iReport를 통해) 프로젝트 설정에 따라 설정해야합니다. 인코딩에 대한 아이디어에 감사드립니다. :)
Tobias

이것은 안드로이드 테스트에서 내 문제 였고 멀티 덱싱으로 수정했습니다.
Prakash Nadar

10

Kevin Panko가 말했듯이 대부분 라이브러리 변경 때문입니다. 따라서 어떤 경우에는 프로젝트 (디렉토리)의 "깨끗한"다음에 빌드가 트릭을 수행합니다.


9

시도 할 수있는 한 가지 방법은 -Xverify:all로드시 바이트 코드를 확인하고 바이트 코드가 유효하지 않은 경우 유용한 오류 메시지를 제공하는 것입니다.


8

여기에 설명 된대로 라이브러리를 가져오고있는 프로젝트를 만들어 Android 에서이 오류를 수정했습니다. http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject에

이전에는 프로젝트를 참조하고 있었지만 (라이브러리가 아님)이 이상한 VerifyError가 발생했습니다.

그것이 누군가를 돕기를 바랍니다.


2
더 이상 링크를 사용할 수 없습니다. 수정하십시오. 감사합니다
Mahdi Rashidi

8

VerifyError는 클래스 파일에 구문 적으로 올바른 바이트 코드가 포함되어 있지만 메서드 경계를 넘는 점프 대상과 같은 일부 의미 제한을 위반하는 것을 의미합니다.

기본적으로 VerifyError는 컴파일러 버그가 있거나 클래스 파일이 다른 방식 (예 : RAM 결함이나 HD 실패 등)으로 손상된 경우에만 발생할 수 있습니다.

다른 JDK 버전과 다른 컴퓨터에서 컴파일하십시오.


5

필자의 경우 내 Android 프로젝트는 Java 7 용으로 컴파일 된 다른 Java 프로젝트에 의존합니다. Java 프로젝트의 java.lang.VerifyError컴파일러 준수 레벨을 6.0으로 변경하면 사라졌습니다.

나중에 이것이 Dalvik 문제라는 것을 알았습니다 : https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE


1
Dalvik은 Java6의 분기 버전이므로 Java7 기능을 사용할 수 없습니다!
Jeroen Wyseur

4

클래스 파일을 mangling 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 을 사용 하거나 이진 파일 편집기로 바이트 코드를 수동으로 편집하는 것입니다.

JVMS가 불법이라고 지시 void하는 return명령 없이 ( return;Java 의 명령문으로 생성 된) 메소드를 작성할 수 있습니다 .

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 컴파일러는 우리 return를 위해 void메소드에 암시 적을 추가하기 때문에이 오류는 Java에서 정상적으로 발생할 수 없습니다 . 우리는 추가 할 필요가 없습니다 이유입니다 return우리에 main방법. 로 확인할 수 있습니다 javap.

JVMS

JVMS 7 장 4.5에 지정된 특정 유형의 잘못된 클래스 파일을 실행하려고하면 VerifyError가 발생합니다.

JVMS는 Java가 파일을로드 할 때 클래스 파일이 실행되기 전에 클래스 파일이 정상인지 확인하기 위해 일련의 검사를 실행해야한다고 말합니다.

JVMS 7 4.10 의 단일 컴파일 및 실행주기에서 이러한 오류를 생성 할 수 없습니다 .

Java 프로그래밍 언어의 컴파일러는 모든 정적 및 구조적 제약 조건을 만족시키는 클래스 파일 만 생성해야하지만 [...]

따라서 최소한의 실패 사례를 보려면을 사용하지 않고 소스 코드를 생성해야합니다 javac.


1

이 페이지는 당신에게 힌트를 줄 수 있습니다-http: //www.zanthan.com/itymbi/archives/000337.html

해당 메소드의 본문에 javac가 발견되지 않는 미묘한 버그가있을 수 있습니다. 전체 방법을 여기에 게시하지 않으면 진단하기가 어렵습니다.

당신은 가능한 한 많은 변수를 final로 선언하여 시작할 수 있습니다 ... 잔잔 사이트에서 언급 된 버그를 잡았을 것입니다. 어쨌든 좋은 습관입니다.


1
그 사람은 2002 년에 컴파일러 버그를 발견했지만 그 이후로 그 버그가 수정되었습니다.
Kevin Panko

1

내 경우에는 내 프로젝트 A가 다른 프로젝트에 대한 종속성을 가졌습니다. 따라서 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

이 오류의 또 다른 이유는 AspectJ <= 1.6.11과 JRE> 6의 조합 일 수 있습니다.

자세한 내용은 Eclipse 버그 353467Kieker 티켓 307 을 참조하십시오.

이것은 JRE 6에서 모든 것이 잘 작동하고 JRE7로 이동하면 문제가 발생할 때 특히 그렇습니다.


1

maven을 사용하여 많은 모듈을 가져 오는 경우에도 발생할 수 있습니다. 정확히 동일한 이름 (동일한 이름)을 가진 두 개 이상의 클래스가 있습니다. 이 오류는 컴파일 시간과 런타임 간의 해석 차이로 인해 발생합니다.


1

java7로 마이그레이션하거나 java7을 사용하는 경우 일반적으로이 오류가 표시 될 수 있습니다. 위의 오류에 직면하여 근본 원인을 찾기 위해 많은 노력을 기울였습니다 . 응용 프로그램을 실행하는 동안 "-XX : -UseSplitVerifier" JVM 인수를 추가하는 것이 좋습니다 .


1

Android Studio 3.6.1Gradle 에서 업데이트 한 후 릴리스 빌드의 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 이하 버전 에서만 발생 합니다.이 두 버전 모두에서 동일한 빌드를 실행 한 경우에도 마찬가지입니다. 이전 버전의 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.+'

그런 다음 핵심 라이브러리 없이 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
jackson-core : 2.2. +가 레거시가되었습니다. 따라서 databind : 2.7.0-rc3, 주석 : 2.7.0-rc3 또는 이보다 최신 버전을 사용해야합니다. 이 2이면 충분합니다. jackson-core : 2.2. +는 피하십시오. 그때까지 몇 가지 확인 오류가 발생했습니다. 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가 함께 제공됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.