Monday, September 25, 2006
자바/Java] Exception in thread 'main' java.lang.NoClassDefFoundError: Foo/class
Q: 자바를 컴파일한 후, 실행시키려면 Exception in thread "main" java.lang.NoClassDefFoundError: Foo/java 이런 에러가 납니다. 원인은 무엇입니까?
A: 대부분의 경우, 파일명을 잘못 입력했기 때문입니다.
예를 들어, Foo.java 라는 소스를 컴파일하여, Foo.class 라는 파일을 만든 후, Foo.class 를 실행시킬 때는,
java Foo
라고 해주어야 합니다.
D:\Z>java Foo.java
Exception in thread "main" java.lang.NoClassDefFoundError: Foo/java
에러! .java 라는 확장자를 붙였음 (이것은 소스 파일이니 당연히 에러가 남)
D:\Z>java Foo.class
Exception in thread "main" java.lang.NoClassDefFoundError: Foo/class
에러! .class 라는 확장자를 붙였음 (심지어 class 확장자도 안됩니다.)
D:\Z>java foo
Exception in thread "main" java.lang.NoClassDefFoundError: foo (wrong name: Foo)
에러! 자바는 항상 대소문자를 엄격히 구분합니다. 리눅스뿐 아니라 윈도우에서도 구분합니다.
따라서 Foo 를 foo 라고 적으면 안됩니다.
D:\Z>java wrir5uedrdu5eu5euer
Exception in thread "main" java.lang.NoClassDefFoundError: wrir5uedrdu5eu5euer
에러! 파일명 오타이거나, 아예 존재하지 않는 파일을 실행하려 했을 때
컴파일을 하지 않아서 Foo.class 라는 파일이 없을 때에도 그런 에러가 납니다.
자바는 컴파일 언어이기에 우선 컴파일을 해야 합니다.
따라서 소스 파일명이 Foo.java 라면, 도스창(윈도우에서의 정식명칭은, 명령 프롬프트)에서, 컴파일하고 나서
java Foo
이렇게 하면 에러 없이 잘 실행됩니다.
이것은 좀 드문 경우입니다. CLASSPATH 환경변수를 잘못 지정하면, 현재 디렉토리에 .class 파일이 있어도 찾지를 못하게 되어 위의 에러가 발생합니다.
가령, 자신이 개발한 자바 클래스들을 넣어두는 폴더가
D:\myhome\java
라고 할 때, CLASSPATH 는
이렇게 지정해야 합니다. 즉 앞에 점(.)이 있어야 합니다. 마침표(.)는 "현재 디렉토리"를 의미합니다.
그냥
CLASSPATH=D:\myhome\java
이렇게 지정해 주면, 자바 실행기는 현재 디렉토리의 .class 파일을 찾지 않게 되고, 그래서 위의 에러가 발생합니다.
도스창에서
set
이라고 치면 현재 환경변수들이 출력됩니다.
자바 1.5의 경우에는 CLASSPATH 환경변수가 없어도 되기에, 초보자의 경우에는 CLASSPATH 를 지정할 필요가 없습니다. (이 경우 CLASSPATH 환경 변수를 삭제하면 문제가 없어집니다.)
다만 자신의 라이브러리가 있을 때에는 CLASSPATH 를 지정해야 하는데, "마침표+세미콜론(;)"을 찍고 그 뒤에 디렉토리를 적어 줍니다.
윈도우에서, 환경변수 변경 방법은 여기에 있습니다: ▶▶ '환경변수'란 무엇인가요? 환경변수 변경/추가/삭제하는 법은? - Environment Variable
주의!
도스창에서 그냥 set 명령으로 환경변수를 변경하면, 그 설정이 윈도우에 저장되지 않습니다. 도스창을 종료하면 설정도 사라집니다. 따라서 위의 방법대로 변경해야 합니다. 그러고 나서 현재의 도스창을 종료하고, 다시 도스창을 띄운 후 자바를 실행해 보시기 바랍니다.
▶▶ [Java/자바 기초] java 소스 컴파일하고, class 실행하기
A: 대부분의 경우, 파일명을 잘못 입력했기 때문입니다.
예를 들어, Foo.java 라는 소스를 컴파일하여, Foo.class 라는 파일을 만든 후, Foo.class 를 실행시킬 때는,
java Foo
라고 해주어야 합니다.
D:\Z>java Foo.java
Exception in thread "main" java.lang.NoClassDefFoundError: Foo/java
에러! .java 라는 확장자를 붙였음 (이것은 소스 파일이니 당연히 에러가 남)
D:\Z>java Foo.class
Exception in thread "main" java.lang.NoClassDefFoundError: Foo/class
에러! .class 라는 확장자를 붙였음 (심지어 class 확장자도 안됩니다.)
D:\Z>java foo
Exception in thread "main" java.lang.NoClassDefFoundError: foo (wrong name: Foo)
에러! 자바는 항상 대소문자를 엄격히 구분합니다. 리눅스뿐 아니라 윈도우에서도 구분합니다.
따라서 Foo 를 foo 라고 적으면 안됩니다.
D:\Z>java wrir5uedrdu5eu5euer
Exception in thread "main" java.lang.NoClassDefFoundError: wrir5uedrdu5eu5euer
에러! 파일명 오타이거나, 아예 존재하지 않는 파일을 실행하려 했을 때
컴파일을 하지 않아서 Foo.class 라는 파일이 없을 때에도 그런 에러가 납니다.
자바는 컴파일 언어이기에 우선 컴파일을 해야 합니다.
따라서 소스 파일명이 Foo.java 라면, 도스창(윈도우에서의 정식명칭은, 명령 프롬프트)에서, 컴파일하고 나서
java Foo
이렇게 하면 에러 없이 잘 실행됩니다.
CLASSPATH 환경변수의 문제
이것은 좀 드문 경우입니다. CLASSPATH 환경변수를 잘못 지정하면, 현재 디렉토리에 .class 파일이 있어도 찾지를 못하게 되어 위의 에러가 발생합니다.
가령, 자신이 개발한 자바 클래스들을 넣어두는 폴더가
D:\myhome\java
라고 할 때, CLASSPATH 는
CLASSPATH=.;D:\myhome\java
이렇게 지정해야 합니다. 즉 앞에 점(.)이 있어야 합니다. 마침표(.)는 "현재 디렉토리"를 의미합니다.
그냥
CLASSPATH=D:\myhome\java
이렇게 지정해 주면, 자바 실행기는 현재 디렉토리의 .class 파일을 찾지 않게 되고, 그래서 위의 에러가 발생합니다.
도스창에서
set
이라고 치면 현재 환경변수들이 출력됩니다.
자바 1.5의 경우에는 CLASSPATH 환경변수가 없어도 되기에, 초보자의 경우에는 CLASSPATH 를 지정할 필요가 없습니다. (이 경우 CLASSPATH 환경 변수를 삭제하면 문제가 없어집니다.)
다만 자신의 라이브러리가 있을 때에는 CLASSPATH 를 지정해야 하는데, "마침표+세미콜론(;)"을 찍고 그 뒤에 디렉토리를 적어 줍니다.
윈도우에서, 환경변수 변경 방법은 여기에 있습니다: ▶▶ '환경변수'란 무엇인가요? 환경변수 변경/추가/삭제하는 법은? - Environment Variable
주의!
도스창에서 그냥 set 명령으로 환경변수를 변경하면, 그 설정이 윈도우에 저장되지 않습니다. 도스창을 종료하면 설정도 사라집니다. 따라서 위의 방법대로 변경해야 합니다. 그러고 나서 현재의 도스창을 종료하고, 다시 도스창을 띄운 후 자바를 실행해 보시기 바랍니다.
▶▶ [Java/자바 기초] java 소스 컴파일하고, class 실행하기
tag: java
자바 | Java
많은 도움이 되었습니다 :)
즐거운 하루 보내시길!
감사합니다. 도움이 되었습니다. 일부 인용하겠습니다~
<< Home