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

Tomcat组件启动失败求助:org.apache.catalina.LifecycleException

组件启动失败求助:ServletContext.getClassLoader()方法缺失

环境信息

  • Gradle 5.4.1
  • JDK 11.0.15 (11.0.15+8-LTS-149)
  • Tomcat 9.0.64
  • 使用SmartTomcat插件运行项目

已尝试操作

  • 为依赖项添加log4j.jar
  • 清除浏览器缓存
  • 反复检查环境变量

补充说明

已将Tomcat中的servlet-api.jar添加到项目库中

Catalina日志

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/eq-cloudwebapp.main]]
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:926)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
http://localhost:8080/eq-cloudwebapp.main
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/eq-cloudwebapp.main]]
    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$StartChild.call(ContainerBase.java:1396)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
    ... 21 more
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader()Ljava/lang/ClassLoader;
    at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:250)
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:233)
    at org.apache.catalina.startup.ContextConfig.processJarsForWebFragments(ContextConfig.java:2136)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1289)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:986)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:303)

问题分析与解决方案

核心错误是java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader(),本质是项目中存在Servlet API版本冲突:

  1. 移除手动添加的servlet-api.jar
    Tomcat 9自带Servlet 4.0版本API,ServletContext.getClassLoader()是Servlet 3.0及以上才有的方法。如果你手动添加了低版本(比如2.5)的servlet-api.jar,会覆盖Tomcat自带的API,导致方法缺失。直接从项目库中删除手动添加的该jar包,让项目使用Tomcat提供的版本。

  2. 修正Gradle依赖配置
    在build.gradle中确保Servlet API依赖的作用域为provided,避免打包到项目中引发冲突:

    dependencies {
        providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
        // 也可以直接用Tomcat对应版本的API
        // providedCompile 'org.apache.tomcat:tomcat-servlet-api:9.0.64'
    }
    

    执行gradle clean build清理缓存后重新构建项目。

  3. 排查依赖树中的冲突
    运行gradle dependencies查看完整依赖树,找出是否有第三方依赖间接引入了低版本Servlet API。如果有,通过exclude排除:

    dependencies {
        implementation('第三方依赖坐标') {
            exclude group: 'javax.servlet', module: 'servlet-api'
        }
    }
    
  4. 检查SmartTomcat插件配置
    确认插件指向的Tomcat目录是9.0.64,且未在插件配置中添加额外的冲突依赖,保证项目运行时使用的是Tomcat自带的Servlet API。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:15:58