1. NoClassDefFoundError란 무엇인가?
java.lang.NoClassDefFoundError
는 컴파일 시 존재했던 클래스가 런타임 중 JVM에서 로드되지 못할 때 발생하는 에러입니다. 주로 클래스패스 문제나 클래스 초기화 오류로 인해 발생합니다.
2. NoClassDefFoundError의 주요 원인
2.1 클래스패스 문제
런타임 클래스패스에서 필요한 .class
파일이 누락된 경우 발생합니다.
예:
- 클래스 경로에 포함되지 않은 JAR 파일
- 잘못된 상대/절대 경로 설정
2.2 클래스 초기화 오류
클래스의 static block
에서 예외가 발생하면 JVM은 해당 클래스를 "정의 불가능" 상태로 간주합니다.
public class Example {
static int problematic = 1 / 0; // Division by zero
}
2.3 컴파일-런타임 환경 불일치
컴파일 시 사용된 JAR 파일이 런타임에 누락된 경우 발생합니다.
2.4 잘못된 클래스 파일 배치
클래스 파일이 패키지 구조에 맞게 저장되지 않았을 경우에도 에러가 발생할 수 있습니다.
3. ClassNotFoundException과의 차이점
- ClassNotFoundException: 동적 로딩 중 클래스가 찾을 수 없을 때 발생
- NoClassDefFoundError: 정적 로딩 중 JVM이 이미 로드하려 했던 클래스가 누락된 경우 발생
4. NoClassDefFoundError 해결 방법
4.1 클래스패스 점검
필요한 .class
파일 또는 JAR 파일이 클래스패스에 포함되어 있는지 확인하세요.
예:
java -cp /path/to/classes MainClass
4.2 패키지 구조 확인
클래스 파일이 올바른 디렉토리와 패키지 구조를 따르고 있는지 확인하세요.
4.3 빌드 환경 확인
Maven, Gradle 등의 빌드 도구 설정을 점검하여 의존성이 누락되지 않았는지 확인하세요.
4.4 JDK 버전 확인
컴파일 및 런타임 환경에서 동일한 JDK 버전을 사용하고 있는지 확인하세요.
5. NoClassDefFoundError 발생 예제
public class NoClassDefFoundErrorExample {
public static void main(String[] args) {
try {
new ProblematicClass(); // ExceptionInInitializerError 발생
} catch (Throwable e) {
System.out.println(e);
}
new ProblematicClass(); // NoClassDefFoundError 발생
}
}
class ProblematicClass {
static int problematic = 1 / 0; // ZeroDivisionError
}
6. 결론
NoClassDefFoundError
는 대부분 클래스패스 누락이나 클래스 초기화 오류로 인해 발생합니다.
- 클래스파일 경로 및 클래스패스를 꼼꼼히 점검하세요.
- 빌드 환경과 JDK 버전을 확인하세요.
위의 해결 방법을 따라 문제를 신속히 해결할 수 있습니다.