Maven使用tomcat7-maven-plugin插件run时出现错误: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
错误如下:
A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext
还有一种错误是:
org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer
可以尝试以下方法:
1、可能引入的servlet版本太高了,比如3.1版本的与Tomcat7插件兼容,可以尝试降级3.0.1。可以参照官方表格进行引入:http://tomcat.apache.org/whichversion.html
2、可能是web.xml的头部版本太高了,可以尝试修改成:****http://java.sun.com/xml/ns/javaee/" id="WebApp_ID" version="2.5"> ****或者2.4这样的。
3、但是观察上面报错的原因,问题出现在:org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer,也就是servlet-api.jar包冲突了导致的。可以尝试排除commons-logging.jar包,因为commons-logging中引入了2.3的servlet-api.jar。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.4.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
但这种方式不一定有效。
也就是围绕包冲突的线索去找一下,参考依赖书去查看是否有冲突的包导致的。
4、尝试把scope加上provided,也就是作用域改成编译时使用,而打包不需要带上:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
5、可以尝试一下把POM上的servlet-api删除,然后在Eclipse的Build Path中加入servlet-api,但这种治标不治本。
6、尝试使用以下的servlet-api:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>7.0.76</version> <scope>provided</scope> </dependency>
7、经过测试,发觉同一份代码在Mac上正常使用,而在Windows上却出现这样的错误,两台电脑唯一不同的是JDK和Maven的版本,接下来尝试将Windows上的Maven升级到最新版本。意外竟然启动成功了。
由于使用的是Windows 10系统,可能JDK版本的问题导致的,先删除旧版的JDK和Maven以及Maven本地仓库,下载最新版本的JDK_1.8.0_131和Maven3.5。安装配置路径参考:http://www.cnblogs.com/EasonJim/p/6821717.html