예전에 작동하는 응용 프로그램이 갑자기 사라져서 NoClassDefFoundError (wrong name)
이 나에게 당황했습니다. 요청한 시간에 구성된 클래스 이름을 사용하여 ClassLoader.loadClass()
을 호출하여 바인딩 된 클래스를 확인하려고하는 XML 바인딩 프레임 워크를 사용하고 있습니다. (이 경우에는 그것이 저를 넘어서는 것처럼 보이는 이유는 무엇입니까?) 이제 방금 언급 한 예외가 java.lang.ClassLoader.defineClass()
으로 바뀝니다. 메서드에 대한 설명서에 따르면 name
매개 변수가 지정된 클래스의 이진 이름과 같지 않으면 NoClassDefFoundError
이 반환됩니다. 나는이 경우 하나의 형태NoClassDefFoundError : A (잘못된 이름 : A)
java.lang.NoClassDefFoundError: A (wrong name: B)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
....
의 예외를 얻을 것으로 기대하고 있음을 알고이 내가 실제로 볼 수있는 결과이지만, 이상한 것은 내 경우에는 A
을보고 B
정확히 같은 점이다 ! 나는 응용 프로그램을 디버깅하려고했습니다. JDK의 소스의 행을 읽습니다
c = defineClass1(name, b, off, len, protectionDomain, source);
source
의 값이 OK입니다. 바이트 배열 b
을 클래스 파일에 저장하고 디 컴파일러로 검사하여 다시 확인합니다. 물론 Class.forName()
가 전반에 걸쳐 같은 오류를보고 있지만, 정말 재미있는 것은 내가 디버그 모드에서 name = null
을 설정하면 내가이 짐승 얻을 수 있습니다 : 이제
java.lang.LinkageError: loader (instance of com/google/gwt/dev/shell/jetty/JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension): attempted duplicate class definition for name: "A"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
내가 이것에 완전히 우둔 느낌을 :(나는 당신의 도움을 주셔서 감사합니다 .
는문제의 클래스 로더가 중요한 경우 com.google.gwt.dev.shell.jetty.JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension
입니다. 클래스 A와 B의 기회의 패키지 선언이 그들 중 일부 패키지 또는 패키지 선언 내부 패키지 선언하지 않고 있습니다 있습니다
변경 한 후 응용 프로그램을 다시 컴파일 했습니까? 그렇다면 무엇 이었습니까? –
나는 시정 해 줘. 나는이 어플리케이션 부분을 실제로 테스트하지 않았기 때문에 버그가 항상 거기에 있었다는 가능성이있다. – Saintali