解决:cannot be cast to javax.servlet.Filter问题

解决ideal中Smart tomcat插件无法正常启动axis1.4项目的问题

问题描述

最近接手了一个老项目,使用的是axis1.4的老javaweb项目,本人使用的是ideal然而这个老项目使用的是eclipse开发的,在搭建ideal的开发环境时发生的如下问题。
由于使用的是ideal的社区版本,所以并没有自带tomcat的插件,为了能够在ideal中顺利使用debug功能,所以我下载了一个Smart Tomcat插件,配置好SmartTomcat插件以后,我开始启动这个axis老项目,但是启动时报错了报错信息如下,这个是tomcat的localhost.log

八月 16, 2024 8:52:27 上午 org.apache.catalina.core.StandardContext filterStart
严重: 启动过滤器异常
java.lang.ClassCastException: com.xxxx.filter.IpFilter cannot be cast to javax.servlet.Filter
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:264)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:5037)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5739)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1016)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:992)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:639)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712)
	at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

在console的现象为

jar not loaded. ...Offending class: javax/servlet/Servlet.class

查阅资料

在查阅了网上的资料以后可以得出结论,这个问题是由于老项目中本身引用了servlet-api.jar导致和tomcat中自带的servlet-api.jar冲突形成的tomcat启动失败的问题,解决这个问题的办法就是在项目中打包时不要打包servlet-api.jar,让tomcat加载自己的servlet-api.jar,这样就可以避免这个问题,网上提供的解决方案是maven配置中的pom.xml进行如下修改,在servlet-api的依赖中加入

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.4</version>
    <scope>provided</scope>  <!-- 加入这一行-->
  </dependency>

最好再检查一下你的其他依赖有没有包含这个包,如果包含的话可以排除依赖。
但是我的axis老项目并没有使用maven包管理器进行依赖管理,我无法这样修改配置,只能在ideal的依赖管理器中进行手动排除

解决方案

首先将tomcat的依赖包单独分离出来
Project Structure->Librarys 在这里将tomcat的依赖包单独列一个包。比如我使用的名字是tomcat-lib,其中就包含了servlet-api.jar这个依赖包。
然后在
Project Structure->Modules ->Dependencies 在这里点击模块的tomcat-lib,这一行的后面默认使用的是Compile,将其修改为Provided就可以了,记得点击应用和确定。

参考资料

https://blog.csdn.net/lufeipeng/article/details/10469709

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值