springboot打war包至tomcat报Cannot cast org.springframework.web.SpringServletContainerlnitializer to j...

项目简介

最近,公司新起了个项目,感觉使用springboot替代当前流行已久的ssm(spring+springmvc+mybatis)开发框架,将要成为趋势,因此我们项目组决定尝试用springboot构建这个新项目。

我们使用idea很快搭建出了以springboot 2.0.3为版本的父子项目,pom中引入相关依赖jar包,用了两天时间创建项目所需工具类,生成一些初步实体类,配置文件写入必要的配置信息,连接数据库,启动端口号,加入mybatis-generator自动生成工具等,写入一些简单的接口测试后,本地调试,项目启动顺利。

使用springboot,第一感觉是配置文件比使用ssm少了很多,没有xml之类的配置,配置也很简单,许多东西springboot都给集成好了,只需用就行,因此创建一个web项目几乎是可用刹那来形容,毫不费力。

项目测试都运行正常,我们就将其部署至测试环境上。我们的项目是以生成war的形式发布测试环境的tomcat里。起初运维人员使用tomcat7版本,出现版本不符合,又更换成tomcat8。启动出现了错误。

错误内容

springboot war发布至tomcat错误
03-Jul-2018 13:39:01.845 SEVERE [localhost-startStop-1] org.apache.catalina.startup.ContextConfig.processServle
tContainerlnitializers Failed to process JAR found at URL [/back] for ServletContainerlnitializers for context
with name [{1}]
java.io.IOException: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerl
nitializer to javax.servlet.ServletContainerlnitializer
at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:185)
at org.apache.catalina.startup.WebappServiceLoader.load(WebappServiceLoader.java:151)
at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:159
7)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1125)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:303)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startlnternaKStandardContext.java:5058)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildlnternaKContainerBase.java:726)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:697)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:976)
at org.apache.catalina.startup.HostConfig DeployWar.run(HostConfig.java:1762)atjava.util.concurrent.Executors D e p l o y W a r . r u n ( H o s t C o n f i g . j a v a : 1762 ) a t j a v a . u t i l . c o n c u r r e n t . E x e c u t o r s RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerlnitializer
to javax.servlet.ServletContainerlnitializer
at java.lang.Class.cast(Class.java:3361)
at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:182)
…19 more

java.io.IOException: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerlnitializer to javax.servlet.ServletContainerlnitializer

这是什么原因造成的呢?经过多方面查找,找到如下两个原因

  • springboot默认提供内嵌的tomcat包,因此打包时需要将自带的tomcat包排除,否则会与外部tomcat冲突,解决方式spring-boot-starter-web下加入exclusions排除spring-boot-starter-tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>

有说使用如下方式,但是我们当时使用,未起作用,不知道是不是为清理干净的原因

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
  • 若引入了javax.servlet-api,还需将其排除掉,否则也会与tomcat中的servlet-api包冲突。处理方式加入provided
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>

经过以上两步,重新打包发布,启动成功。

这是初次正式使用springboot框架搭建项目,出现问题在所难免,后面应该还会出现各种不可预知的问题,但是遇见错误bug不可怕,可怕的是没有任何错误信息,不知道错误藏身之地。发现错误,解决错误,是进步,也是一种快乐与收获。发现错误,解决bug,是项目成功的一大步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值