今天在写代码过程中发现
严重: Allocate exception for servlet com.yinwu.web.ServletDemo1
java.lang.ClassCastException: class com.yinwu.web.ServletDemo1 cannot be cast to class javax.servlet.Servlet (com.yinwu.web.ServletDemo1 is in unnamed module of loader org.apache.catalina.loader.WebappClassLoader @57e420cb; javax.servlet.Servlet is in unnamed module of loader org.codehaus.plexus.classworlds.realm.ClassRealm @12abdfb)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:865)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
问题所在
因为servlet是依赖tomcat实现的一种接口,所以tomcat里会包含servlet的jar包
在pom.xml中配置servlet依赖的时候没有限制servlet 只在编译 和测试阶段生效 即是<scope>provided</scope> 所以会导致打包后java代码依赖库中有servlet的jar包 tomcat里面也有servlet的jar包 两个jar包冲突了
解决办法
在pom.xml中找到servlet依赖给它配置<scope>provided</scope> 让它只在编译 和测试阶段生效 在运行时失效,就可以解决这个问题。