관리 메뉴

I LOVE EJ

java.lang.NoClassDefFoundError : javax.servlet.Serv.. 본문

Com Language/Java

java.lang.NoClassDefFoundError : javax.servlet.Serv..

BeOne 2007. 8. 10. 18:21

CLASSPATH 에 해당 class 가 잡히지 않은 경우 에는 java.lang.ClassNotFoundException 이 발생하지만,

java.lang.NoClassDefFoundError 의 경우는 해당 Class 가CLASSPATH 에 잡혀 있더라도 해당 Class 가 참조하는 다른 클래스를 찾을수 없을경우에 발생합니다.

따라서 java.lang.NoClassDefFoundError : javax.servlet.ServletRequest  의 의미는 ,
호출한 어떤 class 가 javax.servlet.ServletRequest  를 참조 하는데 , 클래스 로더가 javax.servlet.ServletRequest  를 액세스 할수 없을때 발생 하겠죠.

javax.servlet.ServletRequest  의 경우는 servlet.jar 에 담겨 있습니다.
다음 문서를 참조 하시면 중간에 그림이 있습니다.

http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html

이때 servlet.jar 의 경우  그림에서 Common 레벨에 위치 하게 되죠.
클래스로더는 위로는 가지만 밑으로는 가지 않습니다. 그렇다면 아까 에러가 난 그 호출 클래스는 어느 레벨일까요 ?
Common 보다 상위 레벨인 System 이나 Bootstrap 의 레벨이겠죠.

다시 정리 하면 System 이나 Bootstrap 레벨의 어떤 클래스를 호출했는데, 그 클래스가 Common 레벨의 javax.servlet.ServletRequest  에 대한 참조를 가지고 있다면 ?
해당 클래스의 클래스로더는 하위 Common Level 의javax.servlet.ServletRequest  를 가져 올수 없기때문에 위와 같이 java.lang.NoClassDefFoundError : javax.servlet.ServletRequest 메시지를 보게 됩니다.

Bootstap 은 어떻게 설정되는 걸까요 ? 求?JVM 이 물고 올라가는 것들 즉 JAVA_HOME/jre/lib/ext 의 위치에 있는 것이라고 보면 됩니다.
크게 잘못될일이 없겠죠 ?

그렇다면 십중 팔구는 System 레벨이 설정을 해서 그렇게 됩니다.
즉 catalina.bat 을 통해서 설정된 클래스들이 겠죠 . 내부적으로 setclasspath.bat 을 호출합니다.
이때 setclasspath.bat 에서 호출 클래스를 설정하고 그 클래스가 javax.servlet.ServletRequest 에 대한 참조를 가지고 있을경우 문제가 생깁니다.

이전 4.1.12 또는 24 까지만 해도 이 경우 에러가 아니었던걸로 기억하는데 ( 좀 가물 가물 함 ^^;;; ) 최신 버전인 4.1.27 의경우 확실히 체크 하는 군요. ㅡㅡ;;

해결법은 간단 합니다. setclasspath.bat 에 CLASSPATH 로 설정하지 않고 Common 하위 레벨에서 설정 하면 됩니다. 뭐 가장 밑의 Webapp 레벨인 /WEB-INF/classes  도 좋겠지요.

그럼 좋은 하루 되세요 ~

'Com Language > Java' 카테고리의 다른 글

JSP에서 이전 이후 날짜 구하는 함수  (0) 2007.08.10
java.util.Calendar Field 설명  (0) 2007.08.10
calendar 이용 달력  (0) 2007.08.10
Calendar() 달력출력하기  (0) 2007.08.10
Calendar 클래스  (0) 2007.08.10