问题描述
最近接手了一个老项目,使用的是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