Java 프로그램을 작성한 후에는 javac 명령어로 컴파일해야 하며, 이 과정에서 컴파일 타임 오류가 있다면 화면에 표시됩니다.
오류를 모두 수정하고 컴파일에 성공하면 현재 폴더에 클래스 이름과 동일한 이름으로 .class 확장자를 가진 실행 가능한 파일이 생성됩니다.
이후 java 명령어를 사용해 프로그램을 실행할 수 있습니다.
java 클래스_이름
그런데 실행 시점에 JVM이 지정된 이름의 .class 파일을 찾지 못하면 다음과 같은 런타임 오류가 발생합니다.
D:\sample>java Example Error: Could not find or load main class Example Caused by: java.lang.ClassNotFoundException: Example
해결 방법
이 오류를 피하려면 현재 디렉터리에 있는 .class 파일의 이름을 정확하게 지정해야 합니다. 클래스가 패키지에 속해 있다면 패키지 이름까지 포함한 전체 이름(패키지명.클래스명)을 사용해야 합니다.
이 오류가 발생하는 대표적인 상황은 다음과 같습니다.
1. 잘못된 클래스 이름
실행 시 클래스 이름을 오타 없이 정확히 입력했는지 확인해야 합니다. 이름을 잘못 입력하면 JVM이 해당 클래스를 찾지 못합니다.
class Example {
public static void main(String args[]){
System.out.println("This is an example class");
}
}오류 예시
D:\>javac Example.java D:\>java Exmple Error: Could not find or load main class Exmple Caused by: java.lang.ClassNotFoundException: Exmple
해결 방법 - 위 예제에서는 클래스 이름을 'Exmple'로 잘못 입력했습니다. 올바른 클래스 이름으로 수정하면 정상적으로 실행됩니다.
D:\>javac Example.java D:\>java Example This is an example class
2. 대소문자 불일치
Java는 대소문자를 구분하는 언어입니다. 따라서 Example.java와 example.java는 서로 다른 파일로 인식되며, 실행 시에도 정확한 대소문자로 클래스 이름을 지정해야 합니다.
class Example {
public static void main(String args[]){
System.out.println("This is an example class");
}
}오류 예시
D:\>java EXAMPLE Error: Could not find or load main class EXAMPLE Caused by: java.lang.NoClassDefFoundError: Example (wrong name: EXAMPLE)
해결 방법 - 클래스 이름의 대소문자를 소스 코드와 동일하게 맞춰주면 됩니다.
D:\>javac Example.java D:\>java Example This is an example class
3. 잘못된 패키지 이름
클래스가 특정 패키지에 속해 있는데, 실행할 때 패키지 이름을 생략하거나 잘못된 패키지 이름을 지정하면 이 오류가 발생합니다. 패키지에 속한 클래스는 반드시 패키지 이름을 포함해서 실행해야 합니다.
package sample;
class Example {
public static void main(String args[]){
System.out.println("This is an example class");
}
}오류 예시
D:\>javac -d . Example.java D:\>java samp.Example Error: Could not find or load main class samp.Example Caused by: java.lang.ClassNotFoundException: samp.Example
해결 방법 - 위 예제에서는 패키지 이름을 'samp'로 잘못 지정했습니다. 실제 .class 파일이 존재하는 올바른 패키지 이름을 지정하면 문제가 해결됩니다.
D:\>javac -d . Example.java D:\>java sample.Example This is an example class
4. .class 확장자 포함
프로그램을 실행할 때는 .class 확장자를 붙일 필요가 없습니다. 실행 명령에는 클래스 이름만 지정하면 되며, 확장자까지 입력하면 JVM이 'Example.class'라는 이름의 클래스를 찾으려다 실패하게 됩니다.
오류 예시
D:\sample>java Example.class Error: Could not find or load main class Example.class Caused by: java.lang.ClassNotFoundException: Example.class
해결 방법 - 실행 시에는 확장자를 제외하고 클래스 이름만 입력합니다.
D:\sample>java Example This is an example class
정리
'Could not find or load main class' 오류는 대부분 단순한 실수에서 비롯됩니다. 클래스 이름의 오타와 대소문자 여부, 패키지 이름의 정확성, 그리고 확장자 미포함이라는 네 가지만 꼼꼼히 점검하면 대부분의 경우 손쉽게 해결할 수 있습니다.