본문 바로가기

Language/Java

java.lang.NoClassDefFoundError 처리를 위한 간략한 방법

이클립스의 Dynamic Web Project 3.0 상에서 naver의 lucy-xss-servlet-filter 를 확인해야 할 상황이 생겨서

 

필터를 수동으로 web.xml에 등록하고 이용하려고 하면 톰캣이 실행될 때 제목에서와 같이

 

java.lang.NoClassDefFoundError: 가 터지면서 org/apache/commons/logging/LogFactory 클래스를

 

찾을 수 없다는 오류가 계속 발생했었다.

 

Maven도 없고 Gradle 도 아닌 저 다이나믹 웹 프로젝트에서는 직접 빌드 패스에서 라이브러리를 관리해줘야 하는데

 

분명 commons-logging 모듈을 받아서 등록을 해줬는데도 에러는 가시지가 않았다.

 

톰캣이 실행되는 순간 필터로 등록해두었던 XssEscapeServletFitler 클래스가 로딩될 때 저 오류가 지속적으로 발생했으나

 

정작 저 파일의 소스를 뜯어서 보면 LogFactory를 import 하는 코드들에 보면 빨간 밑줄도 없고 아주 문제 없이 잘 나타나있었다.

(이 말은 즉슨 LogFactory 가 잘 인식하고 있다는 얘기... -_-)

 

여러 삽질을 한 결과 클래스를 찾지 못할 경우의 해결책들 중에서 외부에서 라이브러리를 가져오는 경우에 그럴 수 있으니

 

라이브러리를 프로젝트 내부에 두고 클래스 패스를 등록하면 된다고 하는데, 저 말을 단순하게 설명하자면

 

바로 프로젝트 경로의 내부 폴더에 필요한 라이브러리를 모아두고 그 것을 빌드 패스에 등록해서 사용하란 의미이다.

(Maven이나 Gradle을 사용하여 라이브러리 종속성을 관리하면 프로젝트 내부에 알아서 다 쌓아두니 그런 문제가 없었던 듯...??)

 

효율? 성 땜에 항상 여러 프로젝트에서 뭔가를 테스트하기 위해서 jar 파일을 특정 폴더에 모아두고 Add External JARs.. 로

 

외부 라이브러리를 가져와서 사용해왔었는데 이 부분이 문제를 야기시키게 된 셈~

(디스크 용량 부족으로 프로젝트 별로 동일한 라이브러리 넣는 것도 아까워 죽겠... -_-)

 

여하튼 다이나믹 웹 프로젝트 자체의 내부 라이브러리 기본 경로인 webapp/WEB-INF/lib에 필요한 jar을 모아두고 그 파일들을 

 

빌드 패스에서 추가해주니 모든 문제가 해결...

 

왠지 까먹을 것 같아서 기록은 해두나, 기록한 것 자체도 까먹으면.. 흠!~~~ -_-