遇错:
今天遇到一个Bug:A child container failed during start
中文翻译为:子容器在启动期间失败
事情是这样的,一开始我在做案例的时候使用的tomcat是本地集成的,项目能正常运行;
后来我将tomcat的本地集成换成了Maven中的Tomcat插件来部署项项目:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
使用tomcat插件启动项目:
控制台直接报:A child container failed during start
错误分析:
首先要查看一遍自己所写的各种配置文件(pom,web,springMVC ,application,mybatis-config等xml文件)中,是否存在多余的配置;
1、在这里我原先使用本地的tomcat是可以启动项目的,所以应该不是配置的问题;
2、那么是tomcat缓存的问题?
3、清理tomcat缓存之后发现还是报错,
4、查看依赖的包:发现导入的servlet-api坐标存在问题
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
解决问题:
前面说到依赖的坐标出了问题,出来什么问题呢?
原因很简单,在我们内置的tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错;外置的tomcat在打包的时候不会打进来,所以就不会报错;
解决方法也很简单:给servlet-api坐标添加作用范围就可以了
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>