Tomcat9部署war包失败 报IllegalStateException: Error starting child
Tomcat 9部署WAR包抛出
java.lang.IllegalStateException: Error starting child异常解决方案 问题描述
WAR包部署到Tomcat 9服务器时启动失败,抛出外层异常,从日志可见应用已被识别为Spring应用,检测到2个WebApplicationInitializer,但最终容器启动子上下文失败:
2022-07-05 14:40:46,411 [Catalina-utility-2] INFO org.apache.catalina.core.ContainerBase.[Catalina].[site].[/bk]- 2 Spring WebApplicationInitializers detected on classpath 2022-07-05 14:40:46,614 [Catalina-utility-2] ERROR org.apache.catalina.startup.HostConfig- Error deploying web application archive [/home/user/tomcat/webapps/site/bk.war] java.lang.IllegalStateException: Error starting child at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:716) ~[catalina.jar:9.0.16] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) ~[catalina.jar:9.0.16] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) ~[catalina.jar:9.0.16] at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978) [catalina.jar:9.0.16] at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1850) [catalina.jar:9.0.16] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?] at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.16] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) [?:?] at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773) [catalina.jar:9.0.16] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427) [catalina.jar:9.0.16] at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1621) [catalina.jar:9.0.16] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:305) [catalina.jar:9.0.16] at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:9.0.16] at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1144) [catalina.jar:9.0.16] at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1346) [catalina.jar:9.0.16] at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1350) [catalina.jar:9.0.16] at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1328) [catalina.jar:9.0.16] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.16] at java.lang.Thread.run(Thread.java:834) [?:?] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[site].StandardContext[/bk]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441) ~[catalina.jar:9.0.16] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) ~[catalina.jar:9.0.16] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:713) ~[catalina.jar:9.0.16] ... 24 more
排查思路
当前贴出的日志只有Tomcat容器层的包装异常,真正的根因被吞在异常链最内层,不会打印在catalina.out里,别在这几行日志上耗时间,按下面步骤排查:
- 第一步定位真实报错:打开Tomcat的
logs目录,找同时间点的localhost.xxxx-xx-xx.log文件,里面会打印上下文启动失败的具体根因,比如类找不到、配置错误、Bean初始化失败等,这是定位问题的核心依据。 - 常见高频根因和对应修复方案:
- 版本不兼容:Tomcat 9仅支持Servlet 4.0规范,如果打WAR包用的是Spring Boot 3.x版本,其默认依赖Servlet 5.0,和Tomcat 9不兼容。要么把Spring Boot降级到2.x系列,要么把Tomcat升级到10及以上版本。
- 依赖冲突:检查WAR包内
WEB-INF/lib目录,如果存在servlet-api.jar、tomcat-embed-*.jar这类和Tomcat自带类重复的包,就会触发类冲突。在构建配置(Maven/Gradle)里把这类依赖的scope设为provided,让它们不被打进WAR包即可。 - 配置错误:
web.xml语法错误、Spring配置文件路径不对、数据源/Redis等中间件连接配置错误、自定义Filter/Listener/Servlet类路径配置错误,都会导致上下文启动中断,根据localhost日志里的具体报错点修改配置就行。 - 权限问题:如果Tomcat的运行用户对WAR包解压后的目录没有读写权限,也会启动失败,执行
chown -R 你的tomcat运行用户:用户组 /home/user/tomcat/webapps/site/bk给目录授权即可。 - 缓存污染:如果之前部署过同名应用,旧的解压文件、
work目录下的JSP缓存可能导致启动异常,先删掉webapps下对应应用的解压文件夹、清空work/Catalina目录下的对应缓存,再重新部署。
核心提醒:
Error starting child是非常泛的外层报错,没有任何指向性,所有应用上下文启动失败的场景都会抛这个错,必须找到localhost日志里的根因异常才能快速解决问题,不要只靠这几行外层日志瞎猜原因。
内容的提问来源于stack exchange,提问作者Kumaran
相关产品推荐
相关产品推荐

