ERROR

NoClassDefFoundError 와 ClassNotFoundException의 차이는 무엇인가?

백프로♬ 2019. 1. 4. 13:45

NoClassDefFoundError 와 ClassNotFoundException의 차이는 무엇인가?


 코딩을 하다가 프로그램을 실행했는데 다음과 같은 에러가 발생했습니다.


Failed to instantiate SLF4J LoggerFactory

Reported exception:

java.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerAdapter

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(Unknown Source)

at java.security.SecureClassLoader.defineClass(Unknown Source)

at java.net.URLClassLoader.defineClass(Unknown Source)

at java.net.URLClassLoader.access$100(Unknown Source)

at java.net.URLClassLoader$1.run(Unknown Source)

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)


Run Time(실행 시) 필요한 클래스를 찾지 못해서 발생하는 에러인데 가장 많이 볼 수 있는 ClassNotFoundException와 NoClassDefFoundError가 있습니다. 둘의 차이는 무엇일까요? 


 ClassNotFoundException의 경우 Run Time 시 해당 클래스를 호출했으나 classpath에 클래스가 존재하지 않는 경우 발생하며 Class.forName()이나 ClassLoader.ladClass(), ClassLoader.findSystemClass() 메소드를 이용하여 호출하는 경우에 발생하는 예측가능한 Exception 입니다.


 NoClassDefFoundError의 경우 ClassNotFoundException와 같이 해당하는 메소드에서 호출하는 것이 아닌 class를 import할 때 해당 클래스가 존재하지 않으면 발생하는 예측 불가능한 오류사항 입니다.


위 에러의 경우 해당하는 jar파일이 없어서 pom.xml에 추가를 해주었습니다.


<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-api</artifactId>

            <version>2.11.1</version>

    </dependency>


Maven Dependencies에 log4j-api가 추가된 것을 확인할 수 있습니다.