2012-02-04 6 views
1

예전에 작동하는 응용 프로그램이 갑자기 사라져서 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의 기회의 패키지 선언이 그들 중 일부 패키지 또는 패키지 선언 내부 패키지 선언하지 않고 있습니다 있습니다

+0

변경 한 후 응용 프로그램을 다시 컴파일 했습니까? 그렇다면 무엇 이었습니까? –

+0

나는 시정 해 줘. 나는이 어플리케이션 부분을 실제로 테스트하지 않았기 때문에 버그가 항상 거기에 있었다는 가능성이있다. – Saintali

답변

4

해결되었습니다. 그냥 난처한 대문자 문제. AB의 이름은 NoClassDefFoundError: A (wrong name: B)이고 실제로는 이 대문자로 다릅니다.

대소 문자를 구분하지 않는 파일 시스템 때문에 Windows에서 발생합니다. FooBar 클래스를 찾고 폴더에 Foobar.class 파일이 있으면 클래스 로더가 클래스 파일을 열지 만 내부적으로 이름이 다른 것을 발견합니다. 따라서 예외.

+0

이것에 대해 자세히 설명해 주시겠습니까? 나는 비슷한 무엇인가 붙어있다. – Magpie

+0

@Magpie이 (가) 업데이트되었습니다. – Saintali

0

확인이되지 않습니다옳은.

관련 문제