NoClassDefFoundError 와 ClassNotFoundException의 차이는 무엇인가?
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가 추가된 것을 확인할 수 있습니다.