2011-02-25 2 views
1

안녕하세요. 내 코드에서 외부 Java 패키지를 사용하려고하는데 컴파일 할 때 사용한 클래스 경로가 동일하더라도 NoClassDefFoundError을 계속 사용하고 있습니다.NoClassDefFoundError가 컴파일 및 런타임에 동일한 jar 파일을 지정할 때 throw됩니다.

당신의 오락을 위해

나는 의심 할 여지없이 WTF에서 지금

/* WTF/WTF.java */ 
import foo.Bar; 
class WTF 
{ 
    public static void main(String[] args) 
    { 
     Bar dontCare = new Bar(); 
    } 
} 

/* WTF/foo/Bar.java */ 
package foo; 

class Bar 
{ 
    public Bar() {} 
} 

(I는 약 6 시간까지이에서 봤는데) 내 일부에 바보 같은 실수가 될 것입니다 무엇을 베어 뼈 재생을 포함했다 디렉토리 나는 다음과 같은 실행에만 WTF/사용할 수 foo.jar에가 있도록

 
javac foo/Bar.java    [ok] 
javac WTF.java     [ok] 
java WTF      [ok] 
jar cf foo.jar foo    [ok] 

나는 WTF/foo는 디렉토리를 제거합니다.

 
javac WTF.java -cp foo.jar  [ok] 
java WTF -cp foo.jar   [[email protected]#$!] 
 
Exception in thread "main" java.lang.NoClassDefFoundError: foo/Bar 
    at WTF.main(WTF.java:7) 
Caused by: java.lang.ClassNotFoundException: foo.Bar 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 

모든 단서는 크게 감사합니다!

+0

이것이 컴파일 된 것인지 궁금합니다. – adarshr

+0

내 실수 표시 줄은 테스트 파일에서 공개로 표시되었지만 목록을 작성할 때 빠졌습니다. 예 그렇습니다. 컴파일을 제외하고 – norlesh

답변

1

WTF.class 인 디렉토리는 클래스 경로에 있어야합니다. 또한 Bar은 공개되어야합니다. Windows에서 ;로 교체 사용하는 경우

java -cp foo.jar:. WTF 

:

는 리눅스에서 경로 구분이다.

+0

오류 메시지 'WTF'가 발견되었지만'foo.Bar'는 발견되지 않았습니다. –

+0

Chris (리눅스에 있습니다.) – norlesh

+0

@christoffer : 예, classpath 인수가 주 클래스 이름 앞에 있어야하며 현재 디렉토리가 있어야한다고 생각합니다. – Kru

1

잘못된 인수 시퀀스? 시도 :

java -cp foo.jar WTF 
+0

소리가 좋아요. 주 클래스 이름 뒤의 매개 변수는 프로그램에 대한 매개 변수입니다. 그러나'java -cp : : foo.jar WTF'가'WTF.class'를 포함하고 있다면 로컬 디렉토리를 포함시켜야합니다. –

관련 문제