在使用Rose框架进行web开发,并采用maven的tomcat插件的时候,会遇到下面这个问题
java.lang.ClassCastException: net.paoding.rose.RoseFilter cannot be cast to javax.servlet.Filter
产生这个问题的原因肯能是加载了两个Filter,由于类加载器不同而导致的
带着这个疑问去看了一下tomcat6-maven-plugin和paoding-rose两个工程的maven依赖,
发现他们都依赖了servlet-api包,而且两个包的scope都设置成了运行时可用——
tomcat6-maven-plugin为runtime,paoding-rose为compile。
找到了问题的根源,接着就需要解决这个问题。简单来说去掉一个servlet-api就行了,
tomcat6-maven-plugin的无法改变,就只好拿paoding-rose来开刀了,最简单的办法就是将
paoding-rose对servlet-api的依赖去掉,这个工作可以通过exclusions元素来实现。
但是项目在编译和测试阶段还是需要servlet-api包的,因此还要在另外加上对servlet-api
的依赖,不同的是,这个依赖的scope要选择provided。
最终的pom.xml文件如下所示:
<dependencies> <dependency> <groupId>net.paoding</groupId> <artifactId>paoding-rose</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.3</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat6-maven-plugin</artifactId> <version>2.0</version> <configuration> <port>8080</port> <path>/</path> <uriEncoding>utf-8</uriEncoding> </configuration> </plugin> </plugins> </build>