在maven2中使用tomcat plugin的时,报cannot be cast to javax.servlet.Filter的问题
在maven2中使用tomcat plugin启动web应用,在pom.xml中加入以下配置信息:
- <project>
- ...
- <build>
- <!-- To define the plugin version in your parent POM -->
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>tomcat-maven-plugin</artifactId>
- <version>1.0-beta-1</version>
- </plugin>
- ...
- </plugins>
- </pluginManagement>
- <!-- To use the plugin goals in your POM or parent POM -->
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>tomcat-maven-plugin</artifactId>
- <version>1.0-beta-1</version>
- </plugin>
- ...
- </plugins>
- </build>
- ...
- </project>
运行mvn tomcat:run后,tomcat报错误如下:
- java.lang.ClassCastException: common.filter.CacheFilter cannot be cast to javax.servlet.Servlet
【分析原因】
由于CacheFilter实现了javax.servlet.Filter接口,Filter是在servlet-api.jar里,因此pom中有
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.4</version>
- </dependency>
但是tomcat里已经有servlet-api的包,而且版本可能会有不同,所以就会出现ClassCastException的问题
【解决办法】
servlet-api加入<scope>provided</scope>,如下:
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.4</version>
- <scope>provided</scope>
- </dependency>
这样修改后,servlet-api.jar就不会在运行tomcat时被import进去了,不会与tomcat自带的servlet-api有冲突
【避免此类问题的建议】
注意pom.xml中关于包的scope的定义,解决此类包冲突产生的问题