You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Tomcat上重部署Web应用时出现ClassNotFoundException的原因

Tomcat 9部署WAR包偶发失败的原因及解决

问题场景

我正在开发一款Web应用,将其部署至本地Tomcat 9.0.73实例中。通常部署过程正常,但偶尔会触发错误,导致WAR包部署失败,错误日志如下:

13-May-2023 10:14:03.042 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [C:\apache-tomcat-9.0.73\webapps\ROOT.war]
        java.lang.IllegalStateException: Error starting child
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1023)
                at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1910)
                at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
                at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:824)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1617)
                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:318)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:898)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
                at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
                at java.base/java.lang.reflect.Method.invoke(Method.java:578)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
                ... 35 more
        Caused by: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
                at ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addStatus(StatusViaSLF4JLoggerFactory.java:32)
                at ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addInfo(StatusViaSLF4JLoggerFactory.java:20)
                at ch.qos.logback.classic.servlet.LogbackServletContainerInitializer.onStartup(LogbackServletContainerInitializer.java:32)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4929)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                ... 36 more
        Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
                at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
                at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
                ... 41 more

核心原因

从错误栈最底层的*java.lang.ClassNotFoundException: org.slf4j.LoggerFactory*可以明确,问题本质是Web应用的类加载器无法找到SLF4J的核心类。而Logback(作为SLF4J的日志实现框架)在启动时依赖这个类,进而引发一系列连锁错误,最终导致Web应用上下文启动失败。

偶发触发的可能因素

这种非必现的问题,通常和以下情况有关:

  • Tomcat类加载缓存/资源竞争:Tomcat的WebappClassLoader会缓存已加载的类,重复部署时如果旧的类加载器资源未完全释放,可能干扰新应用的类加载流程,导致依赖类找不到。
  • WAR包构建/部署异常:构建过程中(比如Maven/Gradle打包)偶尔出现网络波动,导致SLF4J的jar包未下载完整;或者部署时磁盘IO临时异常,导致WAR包中的SLF4J类文件损坏或缺失。
  • 类加载版本冲突:如果Tomcat全局类库目录(CATALINA_HOME/lib)中存在SLF4J相关jar,同时Web应用自身也包含不同版本的SLF4J jar,偶尔会出现类加载顺序混乱,导致无法加载正确的类。

解决建议

  • 确保WAR包依赖完整:检查构建脚本,确认已正确引入SLF4J核心依赖(slf4j-api),并且打包时该jar被完整包含在WAR的WEB-INF/lib目录下。
  • 清理Tomcat缓存:每次部署前删除Tomcat的work目录以及webapps下已解压的应用文件夹,避免旧类缓存干扰新部署。
  • 统一日志依赖版本:避免Tomcat全局lib和Web应用中出现不同版本的SLF4J/Logback jar,建议将所有日志相关依赖都放在Web应用的WEB-INF/lib中,不要放在Tomcat全局lib目录。
  • 检查本地磁盘状态:确保本地开发环境磁盘空间充足,无IO错误,避免WAR包复制到webapps目录时出现文件损坏。

内容的提问来源于stack exchange,提问作者radumanolescu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:42:02