itVincent Blog - Java Working Fun!

技术引领时代!
posts - 117, comments - 181, trackbacks - 0, articles - 12

【关键词】maven tomcat plugin 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的定义,解决此类包冲突产生的问题


只有注册用户登录后才能发表评论。


网站导航: