개발 이야기/이클립스
org.apache.struts2.dispatcher.FilterDispatcher cannot be cast to javax.servlet.Filter
시반
2010. 4. 1. 11:15
maven 기반의 프로젝트는 dependency한 라이브러리 관리나 테스팅하기에는 정말 좋은 것 같습니다.하지만 m2Eclipse 버그때문인지는 잘 모르겠지만 pom.xml은 직접 타이핑하는 것이 속편할 듯.
이번에 포스팅하는 org.apache.struts2.dispatcher.FilterDispatcher cannot be cast to javax.servlet.Filter 라는 메시지는 내가 m2Eclipse를 가지고 WTP 프로젝트를 설정할 때마다 만났던 오류이기도 한데. 이전에 진행했던 프로젝트 pom.xml을 가져와서 할 때도 간혹 생기는터라 개발환경에 따라 다양한 원인이 있는 것 같습니다.
그렇다고 운에맡길 수도 없는 노릇. 일단 이 오류가 발생하는 일반적인 이유는 pom.xml에 정의된 servlet-api 가 maven을 통해 배포시 포함되어 생기는 tomcat의 servlet-api 충돌문제라서 pom.xml에 정의되어 있는 servlet-api부분을 다음과 같이 수정하면 됩니다.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>test</scope>
</dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>test</scope>
</dependency>
즉 scope 속성이 빠져 있거나 provided 로 되어 있는 경우에 주로 발생하게 되는 오류라 할 수 있습니다. 그런데 전자의 경우는 그럭저럭 이해가 가지만 후자의 경우인 provided은 컴파일시에는 참조를 하되 배포시에는 제외하도록 하는 것이라 결과적으로는 같은 것 같은데도 위와 동일한 에러를 발생시키는 것을 보면 잘 이해가 가지 않는 부분이기도 합니다. 의미상으로야 차이는 있겠지만....-_-a
물론 scope가 빠져있거나 provided로 되어 있어도 정상적으로 동작하는 경우가 있습니다.(운이 좋다면...) 머 이 경우에는 그냥 쓰시면 될 것 같고 앞으로는 속편하게 scope를 test 로 포함하면 될 일이다.