问题描述: 这两天在开始做项目时,好不容易将开发环境搭建好了,但项目一run as启动时就报错;问题困扰了我两天,后来通过静下心来,慢慢分析报错的原因,终于找到了问题的所在。
启动时控制台输出的报错信息:
“can’t start tomcat”,不能够启动tomcat服务器,其中我找到了一条主要的报错原因:
at org.springframework.web.SpringServletContainerInitializer.onStartup
后来查询解决问题后才知:
在搭建SSM架构的时候,有时启动的时候会抛出以上的异常,这个异常一般都是web.xml文件的内容有错,或者pom.xml有问题(jar包冲突),而且后者的可能性会大一点。
根据org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer我们可以发现可能和javax的jar包有关。检查pom文件,我发现确实引入了相关的jar包,推断可能和tomcat的内置的相关jar包冲突了,解决方案很简单,我们只需要在引入jar包的时候,添加:
<scope>provided</scope>
让tomcat容器使用这个jar包,而不要使用自己lib里的该jar包。(我就是因为在pom.xml中导入javax.servlet.jsp.jstl的jar包坐标时没有书写provided,才导致项目一启动时就报错!)
另: scope标签一共有5个值,它们的作用如下:
- compile,缺省值,适用于所有阶段,会随着项目一起发布。
- provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
- runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
- test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
- system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。