Maven으로 구성한 웹 프로젝트가 있다. Eclipse에서 디버깅을 하기 위해 Tomcat과 같은 WAS 설정을 하고 프로젝트를 디플로이 해서 사용하고 있었다. 헌데.. 이 잘 되던 프로젝트가 다른 사람의 Eclipse로 옮기거나 Eclipse 설정을 다시 할 때 아래와 같은 알 수 없는 ClassNotFoundException을 찍 뱉으며 실행이 되지 않는 경우가 종종 있다.
아래 오류가 이상한건.. Maven dependency로 잡아준 라이브러리의 클래스가 존재하지 않는다는 어처구니 없는 메시지이기 때문이다. 분명히 이쁘게 잘 잡아준 라이브러리가 존재하지 않는다고 하니 멍하니 하늘만 쳐다볼 뿐.. (아래 오류는.. Maven으로 Spring 라이브러리를 잡아 주었는데도 불구하고 WAS가 그 라이브러리를 인식하지 못 해서 못 찾는 오류 내용이다.)
2011. 2. 8 오후 1:45:20 org.apache.catalina.core.StandardContext listenerStart
심각: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3877)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
구글링을 해도 돌아오는 대답은 WAS의 라이브러리 경로에 해당 라이브러리 jar 파일을 넣어주라는 것 뿐.. 하지만 그럴거면 왜 힘들게 Maven을 쓰노?? Maven으로 라이브러리 종속 관계를 편하게 설정하고 사용하기 위한 것 아닌고?? 미친척 하고 오늘 하루 종일 아무 일도 안 하고 구글링만 했다. 오오~~ 우연히 발견한 반짝반짝 빛이 나는 멋진 글!! TㅅT
해결 방법은 Eclipse 프로젝트의 .classpath 파일에 다음과 같이 적어주어서.. 프로젝트를 WAS로 디플로이 할 때 프로젝트의 라이브러리를 함께 사용할 수 있도록 설정해 주어야 한다는 것!! 굳이 내용을 살짝 살펴보면 Maven으로 추가한 라이브러리(org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER)를 /WEB-INF/lib 경로로 넣어서 WAS에 배포될 때 함께 사용할 수 있도록 한다.. 정도?? -ㅅ-;;
<attributes>
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
</attributes>
</classpathentry>
.classpath 파일은 workspace 경로에 해당 프로젝트 폴더 최상위에 존재한다. Eclipse에서는 Package Explorer나 Project Explorer에서는 숨겨져 있어 보이지 않고 Navigator view를 사용하면 볼 수 있다.
이 문제로 매번 고생하면서 오늘도 몇 시간을 날렸는데.. 답은 의외로 너무 간단하게 1줄.. 아.. 죽갔네.. 이런 문제 젤 시러.. -ㅅ-;;
수정 덧)
권남님의 덧글로 더 쉽게 설정하는 방법을 알았다. 정말 감사합니다~~
프로젝트를 오른쪽 클릭하고 "Properties"를 선택하여 Properties 창을 연다. 그리고 왼쪽 메뉴(?)에서 "Deployment Assembly"를 선택하면, WAS에 배포될 때 함께 사용될 녀석들을 관리할 수 있다. Maven Dependency로 걸린 녀석들을 라이브러리로 추가하기 위해 "Java Build Path Entries"를 선택한다.
그리고 "Maven Dependencies"를 선택하면 끝~~
이렇게 설정되면 .classpath 파일에 위에 쓰여진 내용이 자동으로 설정된다. 으흐~~ 쉽다~~ ㅋㅋ
'JAVA' 카테고리의 다른 글
Maven 정보 - 2 (0) | 2012.07.29 |
---|---|
Maven 정보 - 1 (0) | 2012.07.29 |
class is not accessible due to restriction error 해결 (0) | 2012.07.29 |
JSP에서 HTML 생성하기 (0) | 2012.07.29 |
StringTokenizer, FileWriter (3) | 2012.07.29 |