Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Eclipse, Maven, Tomcat] Maven으로 구성한 웹 프로젝트가 Eclipse에서 실행되지 않는 문제 Computer & Program

Maven으로 구성한 웹 프로젝트가 있다. Eclipse에서 디버깅을 하기 위해 Tomcat과 같은 WAS 설정을 하고 프로젝트를 디플로이 해서 사용하고 있었다. 헌데.. 이 잘 되던 프로젝트가 다른 사람의 Eclipse로 옮기거나 Eclipse 설정을 다시 할 때 아래와 같은 알 수 없는 ClassNotFoundException을 찍 뱉으며 실행이 되지 않는 경우가 종종 있다.

아래 오류가 이상한건.. Maven dependency로 잡아준 라이브러리의 클래스가 존재하지 않는다는 어처구니 없는 메시지이기 때문이다. 분명히 이쁘게 잘 잡아준 라이브러리가 존재하지 않는다고 하니 멍하니 하늘만 쳐다볼 뿐.. (아래 오류는.. Maven으로 Spring 라이브러리를 잡아 주었는데도 불구하고 WAS가 그 라이브러리를 인식하지 못 해서 못 찾는 오류 내용이다.)

정보: Starting Servlet Engine: Apache Tomcat/6.0.20
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에 배포될 때 함께 사용할 수 있도록 한다.. 정도?? -ㅅ-;;

<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
    <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 파일에 위에 쓰여진 내용이 자동으로 설정된다. 으흐~~ 쉽다~~ ㅋㅋ


덧글

  • 권남 2011/02/10 11:03 # 답글

    이런걸 가지고 설정 파일 건들게 만드는 이클립스가 밉습니다.. 아무튼 설정 파일을 건들지 않고 Eclipse내부에 이에 관한 설정이 존재합니다.
    프로젝트에서 우클릭 -> Properties -> Deployment Assembly 에서 다른 프로젝트나 Java Build Path Entries 등을 선택해서 추가해주면 됩니다.

    아무리 봐도 이건 Eclipse의 버그입니다.
  • Sigel 2011/02/10 21:05 #

    아아~~ 거기 있었군요 TㅅT 정말 중요한 정보 감사합니다.
    이제 손쉽게 수정할 수 있겠어요..
    감사합니다~~ ^^
  • kyu 2011/03/18 14:02 # 삭제 답글

    좋은글 잘보고 갑니다~
  • Sigel 2011/03/19 22:37 #

    좋은 글은요.. 도움이 된다면 다행입니다.. :)
  • 꿈꾸는가인 2011/03/21 20:32 # 삭제 답글

    이클립스에서 maven 프로젝트를 생성하면 톰캣에 프로젝트 추가가 안되어 디버깅을 할 수가 없는데
    요건 어떻게 하는 건가요?
  • Sigel 2011/03/23 21:56 #

    이클립스에서 "Servers" view를 여시고.. 해당 프로젝트를 추가하시면 됩니다.
    "Window" -> "Show View" -> "Other..." -> "Server/Servers" 를 선택해서 view를 여세요..
    그리고 "Servers" view에서 오른쪽 클릭을 하시고 "New" -> "Server" 선택하고 설치되어 있는 톰캣의 홈을 지정해 줍니다. 그러면 "Servers" view에 톰캣 서버 하나가 보일겁니다. 이 추가된 서버에 오른쪽 클릭을 하셔서 추가하실 프로젝트를 선택하시면 됩니다.

    말로 쓰니 어렵나 -ㅅ-;;
  • 꿈꾸는가인 2011/03/25 14:09 # 삭제 답글

    아~, 그건 저도 아는데요.
    서버 생성하고 프로젝트 추가할때 나타나는 프로젝트들은 모두 다이나믹 웹 프로젝트만 나타나잖아요.
    그렇지 않고 메이븐 프로젝트(이클립스 플러그인 써서)로 생성한 프로젝트를 톰캣 서버에 추가하는 방법이 있나 해서요...
    님께서 메이븐으로 구성한 웹프로젝트를 톰캣으로 디버깅했다고 하길래 궁금해서 여쭤본겁니다.
  • Sigel 2011/03/25 16:20 #

    메이븐 프로젝트를 생성할 때 architype을 "maven-archtype-webapp"를 선택하면 웹 프로젝트로 생성됩니다.

    혹, 이미 프로젝트를 웹 프로젝트가 아닌 것으로 생성된 상태라면.. 프로젝트 오른쪽 클릭 -> "Properties"을 선택하여 열린 프로젝트 창에서 설정이 가능합니다. 프로젝트 창의 왼쪽 메뉴에서 "Project Facets"를 선택하고 오른쪽에 "Convert to faceted form..."을 선택하면 프로젝트에서 사용할 수 있는 모듈 등을 선택할 수 있습니다. 여기서 "Dynamic Web Module"에 체크하시면 웹 프로젝트로 변경됩니다. 이렇게 하시면 "Servers" view에 추가하실 수 있을겁니다.
  • 꿈꾸는가인 2011/03/29 10:48 # 삭제 답글

    훌륭한 답변 감사합니다.
    새로운 팁을 하나 배웠네요.
  • Sigel 2011/03/31 11:32 #

    :)
  • locust 2011/04/07 18:15 # 삭제 답글

    "Deployment Assembly" 를 사용한 Maven Dependencies 사용은 servlet-api.jar 를 함께 포함하게 됩니다.
    servlet-api.jar는 톰캣에 이미 포함되어 있는것이죠.
  • Sigel 2011/04/07 19:43 #

    음.. 여기서는 Maven Dependencies에 포함된 다른 라이브러리들을 찾지 못 하는 오류 문제를 얘기하는 것이지요.. 이미 dependency가 추가됐는데 WAS의 라이브러리 경로에는 존재 하지 않아서 못 찾는 것이 원인이었고.. Deployment Assembly를 사용하면 해당 라이브러리를 참조하게 된다는..

    그런.. 문제라고 할까요.. 예를 들어, Spring이나 iBatis 라이브러리가 Tomcat의 라이브러리 경로에 포함되지 않은 경우?? 음.. =ㅅ=;
  • locust 2011/04/08 09:08 # 삭제 답글

    Maven Dependencies를 톰캣에서 찾을 수 없었던 해결하기위한거라는걸 모르는게 아니고요.
    Deployment Assembly를 사용했을 때 개발환경에서 필요한 라이브러리와 배포시 필요한 라이브러리를 구분하지 못한다는 문제를 이야기한거에요.

    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
    <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
    </attributes>
    </classpathentry>

    위의 패스를 정의하면 보통은 배포시에 maven이 알아서 라이브러리 구분해서 넣어주는게 보통인데,
    Eclipse 의 버전을 타는건지 Helios에서는 안되더군요.
    저도 임시로 Deployment Assembly 를 사용하고는 있습니다만...
    MAVEN2_CLASSPATH_CONTAINER 원래 기능은 서버와 중첩되는 라이브러리를 함께 배포하진 않습니다.
  • Sigel 2011/04/08 13:29 #

    음.. 톰캣과 같이 Runtime 환경에 이미 포함되어 있는 라이브러리라면.. 이런 방법은 어떨까요??

    Project 오른쪽 클릭해서 "Properties" 메뉴에서..
    왼편에서 "Project Facets"을 선택한 다음 가운데 부분에서 "Dynamic Web Module"을 선택하고 오른쪽에 보면 "Detail/Runtimes"와 같은 탭이 있습니다. 여기서 "Runtimes"탭을 선택하면 Eclipse의 "Servers"에 추가하신 WAS목록이 보입니다. 원하는 버전의 WAS를 체크하면 Maven 라이브러리와는 별도로 WAS의 라이브러리를 추가하여 사용할 수 있더군요.

    이리저리 테스트해 본 걸로는.. servlet-api 라이브러리를 Maven dependency에서 제거하고.. "Project Facets"의 "Dynamic Web Module"에서 "Runtimes"를 "Apache Tomcat v7.0"에 체크했습니다. 그랬더니 프로젝트 라이브러리에 "Maven Dependencies"와는 별도로 "Apache Tomcat v7.0"이라는 라이브러리가 추가되네요. 여기에 servlet-api를 포함하여 Tomcat에 있는 라이브러리가 들어 있네요. 물론 코드에서도 Maven Dependency 없이 사용할 수 있구요..

    댓글이라 글로 쓰려니 좀.. 횡설수설.. -ㅅ- 아.. 제 이클립스는 Helios(3.6 맞나 -ㅇ-;) 입니다.
  • yari 2011/12/21 16:56 # 삭제

    Sigel님 정보 공유 감사합니다.
    그런데 "Project Facets"에서 Maven 라이브러리와는 별도로 WAS의 라이브러리를 추가하여 사용하는 방법은 각 개발머신에 WAS를 설치해야된다는 얘기인가요?
    여러 명이 개발할 때 라이브러리를 자동으로 통일 시켜준다는 점에서 Maven을 쓰는 것 같은데요..
    Sigel님 방법이면 각 머신에 라이브러리를 수동으로 복사하는 것과 차이가 없는 것 같다고 생각하는데 아닌가요?
  • jwlee1728 2011/10/31 00:27 # 답글

    덕분에 도움되었습니다.
    데스크탑(xp)에서는 잘되는게 맥에서는 잘 안되서
    이것저것 검색하는 중에 posting 하신게 나왔네요 +_+
    감사합니다 ㅎㅎ
  • Sigel 2011/11/02 14:41 #

    도움이 되셨다니 좋네요 :D
  • 이창우 2011/11/05 13:34 # 삭제 답글

    메이븐을 사용하는데 정말 큰 도움되었습니다.
    스크린샷 첨부해주신 자세한 설명 정말 감사합니다.~~
  • Sigel 2011/11/05 17:14 #

    도움되셔서 좋네요 :D
  • yari 2011/12/21 17:04 # 삭제 답글

    eclipse indigo + tomcat7.0.22 + maven3.0.3 를 쓰려고 합니다.
    javax.servlet.* 때문에 servlet-api.jar 를 maven dependency로 잡아줬는데요...
    deploy하면 LinkageError가 뜹니다.
    어는 글을 보면 deploy 할 was에 이미 있기 때문에 maven dependency에 넣어주면 안된다는데요..
    그럼 코딩하는 머신이 여러대 일 때 어떻게 하면 공통된 was의 라이브러리를 참조할 수가 있나요?
    각 머신에 was를 설치하는 방법말구요..
  • Sigel 2011/12/22 08:55 #

    dependency가 이미 WAS에 있다면.. maven dependency에 scope을 compile로 줘보세요. 컴파일할 때만 참조를 하고, test나 deploy할 때는 넣지 않기 때문에 WAS에 있는걸 사용하게 되겠죠..

    코딩하는 머신이 여러대라는건 개발하는 사람 마다 다른 (버전 등의) WAS를 사용하는걸 의미하시는건가요?? 배포하는 WAS가 여러 버전이라는걸 의미하시는건가요?? 음.. 저는 두 경우 모두 서로 다른 dependency를 바라봐서 문제가 될 수 있으니, 가능하다면 maven dependency를 보도록 쓰고 있습니다. 예를 들어, tomcat 7은 새버전의 library를 보는데 tomcat 6은 구버전을 본다면 문제가 될 수 있으니, maven dependency로 모든 환경이 같은 library를 볼 수 있게.. 전체 환경([[WAS]]/lib) 보다 로컬 환경 설정이 우선하니 /WEB-INF/lib로 설정이 가능할겁니다. (이런 경우는 많지 않겠지만, 장비 증설 등으로 새 장비에는 tomcat 7, 구 장비에는 tomcat 6이 설치되거나 하는 경우도 있을 수 있으니까요.. 꼭 WAS만이 아니라 WAS에 추가되어 있는 library 버전 등도 같은 문제가 될 수 있으니..)
  • Sigel 2011/12/22 09:15 #

    위에 또 다른 덧글로 써주신 내용은.. 개발자의 개발PC에는 당연히 WAS가 설치되어야 한다고 생각됩니다만.. WAS 없이 테스트를 어떻게 하실건가요?? 로컬에서 확인도 안 하고 서버로 올리실건 아니시잖아요..

    웹 프로그램이기 때문에 실제 서비스할 때 WAS상에서 돌아가기 때문에 WAS의 lib 경로에 있는 공통 library는 자동으로 포함됩니다. 때문에 개발환경에도 WAS library를 추가해서 개발하는 것입니다. (그래서 서비스할 WAS와 비슷한 버전의 WAS를 로컬에 깔아서 사용하는게 좋을 것이고요.. 예전에 서비스 서버는 tomcat 5.5를 사용하는데 로컬에서 6 버전으로 개발해서 정상적으로 동작하지 않았던 경우도 있었습니다. 하지만 꼭 그렇지도 않고요.. 지금은 enginx를 쓰지만 제 로컬에서는 tomcat으로 테스트하고 있습니다. 버전에 따라 미묘한 차이가 -ㅅ-;;;)

    만일 로컬에 WAS를 설치하기 싫으시다면 또 다른 덧글로 쓴 것 처럼 WAS의 dependency를 compile이나 test scope으로 주고 사용하세요.
  • 헤르메스 2012/02/02 20:56 # 삭제 답글

    감사합니다.
    Maven을 처음 사용하다 보니 모르는 문제가 많네요..
  • Sigel 2012/02/05 00:25 #

    쓰다보면 정말 편해요..
    프로젝트 설정이 pom.xml 하나로 되고.. 플러그인도 많고.. :D
  • kakadais 2012/02/14 14:36 # 답글

    모두가 xp에서 개발을 하는데 혼자 mac에서 spring web project 개발을 하려니 저만 이런 문제가 발생해서 수동 war배포를 하며 살았드랫습니다. ㅠㅜ 정말 땡큐 베리감사-!

    추가 팁으로는 .classpath 파일에 해당 내용이 기재가 돼있는데도 라이브러리 복사가 되지 않길래 왜 그런가 하고 찾아 보니 Eclipse UI에서 다시 시도해보니 아래와 같이 설정이 추가되면서 복사가 되더군요
    <classpathentry exported="true" kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
    <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
    </attributes>
    </classpathentry>
    <classpathentry exported="true" kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
    <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
    </attributes>
    </classpathentry>

    원인을 생각해보니 ide에 포함된 maven이 아니라 m2e 플러그인을 사용해서 그런 것 같습니다.

    암튼 정말 감사감사!
  • Sigel 2012/02/15 16:52 #

    잘 쓸 수 있게 되셨다니 다행이네요 :D 지금 버전 Eclipse는 잘 모르겠는데 STS에는 m2e 프러그인이 이클립스로 통합되었습니다. 2.7인가 2.8버전에서.. 아마 STS뿐만 아니라 이클립스 자체에도 m2e플러그인이 통합된거로 기억되는데 정확하게는 잊어버려서..
    저는 STS를 쓰고 있는데 이제는 .project나 .classpath는 이제 필요 없을 정도로 플러그인이 잘 되더군요.. pom.xml만 있으면..
  • kenu 2013/01/16 00:27 # 삭제 답글

    감사합니다.
    덕분에 쉽게 해결되었습니다.
    행복하세요.
  • Sigel 2013/01/16 09:52 #

    도움이 되셨다니 저도 기분이 좋네요 :D
  • 행복한개발자 2014/11/08 14:30 # 삭제 답글

    이 문제로 스트레스가 쌓여가던 중 한 줄기 빛이 되어 주셨습니다. 감사합니다. ^^
댓글 입력 영역

Google AdSense (text/image)