본문 바로가기
Java 웹 프로그래밍

java.lang.NoClassDefFoundError: Could not initialize class 해결

by irerin07 2019. 1. 16.
728x90

Servlet + JSP 를 사용하여 게시판을 만들던 중에


java.lang.NoClassDefFoundError: Could not initialize class 오류가 발생하여 이를 해결 한 과정을 적습니다.


Apache tomcat 8.5.34 버전

Hikaricp 3.3.0버전 사용


서버를 돌리면 java.lang.NoClassDefFoundError: Could not initialize class 오류가 발생.


Intellij 콘솔에서 

Failed to load class "org.slf4j.impl.StaticLoggerBinder".

오류가 발생하는 것을 발견 


pom.xml에 다음을 추가

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>

해결이 되나 싶었는데 여전히 

java.lang.NoClassDefFoundError: Could not initialize class 오류 발생


다시 Intellij 콘솔 창 확인하니

log4j:WARN Please initialize the log4j system properly.

위와 같은 에러가 발생


pom.xml에 다음을 추가

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
</dependency>


그 이후에 실행하니 정상적으로 실행이 된다.


그런데 콘솔창을 확인 하니


SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/C:/Users/count/IdeaProjects/hierarchicalboard/target/hierarchicalboard/WEB-INF/lib/log4j-slf4j-impl-2.11.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/C:/Users/count/IdeaProjects/hierarchicalboard/target/hierarchicalboard/WEB-INF/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2


다음과 같은 오류 메세지가 나온다.


정상적으로 실행은 되는데 중복되는 SLF4 바인딩이 존재한다고 한다.


그런데 위에 추가한 dependency중 하나라도 빠지니

java.lang.NoClassDefFoundError: Could not initialize class 이 에러가 계속 난다.


조금 더 검색 해봐야 할듯...?


-----

추가내용


해당 에러는 실제로 어떤 파일이 빠지거나 해서 발생하는 에러가 아닐수도 있습니다.


만약 해당 에러가 발생한다면 static initializer부분에 try catch를 사용하여 정확히 무슨 에러가 발생하는지 확인해보는게 좋을 것 같습니다.


에러 메시지를 보고 현재 개발 환경 버전과 다른 버전의 파일이 읽힌다면 아마 그것때문에 해당 에러가 발생했을 가능성이 높습니다.


그 외에 dependency 역시 다시 잘 확인해보시기를 추천 드립니다.


dependency에서도 서로 버전이 꼬이거나 하는 경우가 자주 발생합니다.


한가지 예를들자면


A라는 기능은 B가 5.4.5 버전 이상일때만 사용 가능한데, 현재 사용중인 B의 버전이 5.3.5라면 A라는 기능을 사용하려 할 때 dependency가 꼬여버려 에러가 발생할 수도 있습니다.


위와 같은 이유 외에도 다른 이유로 의존성이 꼬일 수 있습니다.

728x90