달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
.. .. ..
[펌]       : http://open.egovframe.go.kr/projects/freediscussion/share/2610
[작성자] : 정지범 님

부재 :
이유 없는 "java.lang.ClassNotFoundException : org.springframework.web.context.ContextLoaderListener" 을 더이상 보고 싶지 않은 개발자에게..

전자정부 표준프레임워크 기반을 프로젝트 수행 중에 개발환경에서 "java.lang.ClassNotFoundException : org.springframework.web.context.ContextLoaderListener" 를 한번 보지 못한 사람은 아마도 없을 것이다. 필자역시 표준프레임워크 구축 프로젝트를 수행하면서 업무로직을 구현하고 집으로 칼퇴근 해야 할 아까운 시간에 WTP, Tomcat, M2Eclipse, maven 의 궁합에 대해 고민하는 무의미한 시간을 보내는 쓰디쓴 경험을 한 기억이 있다.


1. Eclipse Upgrage로 해결?

WTP, m2Eclipse로 고민하던 때… 처음으로 시도한 방법은 Eclipse 업그레이드!!
소프트웨어의 업그레이드는 막연한 기대감을 주는데.. 나도 그 유혹에 잘 넘어가는 편이라 문제가 발생하면 먼저 업그레이드 부터 생각한다. 전자정부 표준프레임워크의 개발환경 IDE는 Eclipse 3.4를 기반으로 개발되었다. 현재 Eclipse는 3.7 까지 릴리이즈 되었으니 상당히 구버전이라고 할 수 있다. 테스트는 Eclipse 3.6 에서 수행하였다.
먼저 프로젝트 생성 후 pom.xml에 표준프레임워크 관련 dependency를 설정하고 WTP, Tomcat으로 실행!! 역시 눈에 익은 오류가 보인다.

"java.lang.ClassNotFoundException : org.springframework.web.context.ContextLoaderListener"

maven dependency에 설정한 라이브러리가 배포되지 않아서 발생하는 오류다. 이를 해결하기위해서 "프로젝트 선택 > 우클릭 > properties > Deployment Assembly 메뉴 > Add 버튼 > Java Build Path Entries > Maven Dependencies 선택" 을 한 후 다시 실행하였다. 성공!!

축배를 들고 싶었다. 여기서 더이상 시간을 쓰고 싶지 않았다. 하지만 이 방법은 치명적인 단점이 있었다. 그것은 maven dependency의 scope가 정상적으로 적용되지 않는다는 것이다.

maven은 dependency에 scope란 옵션이 있다. scope는 compile, provided, test 등이 있으며 의미를 가진다.
예를 들어 provided 의 경우, 컴파일 단계에서 클래스 패스에 추가 하여 사용되긴 하지만 배포 모듈에 포함되지는 않는다. 일반적으로 Java EE 의 API 클래스가 이런 옵션을 사용하게 된다.

Eclipse의 Deployment Assembly를 사용하는 경우, war안에 Java EE API가 포함되어 일부 WAS에 뜻하지 않는 오류가 발생하였다.

2. Maven & Jetty
고심끝에 두번째 방법은 WTP와 Tomcat을 버리는 것이었다. 또 한가지 알게된 것은 Maven이 eclipse가 없는 환경에서도 너무나 많은 일을 할 수 있다는 것이다. 유명한 오픈소스 apache camel은 배포 파일에 까지 포함해서 실행시 maven 명령어를 쓰도록 가이드 하고 있다.

WTP와 Tomcat을 대체할 maven의 플러그인은 바로 jetty plugin 이다. jetty 는 www.mortbay.org 에서 관리하는 오픈소스 servlet 컨테이너 이다. 워낙 경량형 이기도 하고 실행 모듈에 포함해서 서블릿 엔진을 따로 설치하지 않아도 사용할 수 있는 제품을 패키징 할때 포함하기도 한다. Google Appengine의 개발환경에서도 log를 통하여 jetty를 사용하고 있다는 사실도 주목할 만 하다.( App Engine에 흠뻑 빠진 요즘 구글이라면 항상 믿음이 간다. )

이러한 경량의 특성을 살려 maven plug-in으로서도 널리 사용된다. jetty maven 플러그인은 (http://docs.codehaus.org/display/JETTY/Maven Jetty Plugin)에서 사용법을 확인 할 수 있다.

적용방법

1. 먼저 전자정부 표준프레임워크 개발환경에서 수행중인 프로젝트의 pom.xml 을 연다.
2. <build> 설정에 아래의 플러그인 설정을 추가한다.

<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.2.2.v20101205</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<reload>automatic</reload>
</configuration>
</plugin>
</plugins>
</build>

3. "프로젝트 선택 > 우클릭 > Run As > Maven Build > Goal에 jetty:run 입력 > 확인 " 을 차례로 수행'
4. 웹브라우저 접속 "http://localhost:8080";
5. 성공!!

사실 이 방법은 실행 및 테스트에 있어서 Eclipse의 도움을 거의 받지 않는 방법이다. 이로 인해 integration으로 인한 자잘 한 오류에서 벗어 날수 있었다.
무엇보다도 maven의 특성이 정확하게 적용되는 것으로 인해 개발자 PC의 환경의 pom.xml이 개발서버에서도 일관되게 사용할 수 있어 Continuous Integration 적용에도 큰 도움이 된다.

참고 사이트 : http://docs.codehaus.org/display/JETTY/Maven Jetty Plugin
.
:
Posted by .07274.