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版本冲突:
移除手动添加的servlet-api.jar
Tomcat 9自带Servlet 4.0版本API,ServletContext.getClassLoader()是Servlet 3.0及以上才有的方法。如果你手动添加了低版本(比如2.5)的servlet-api.jar,会覆盖Tomcat自带的API,导致方法缺失。直接从项目库中删除手动添加的该jar包,让项目使用Tomcat提供的版本。修正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清理缓存后重新构建项目。排查依赖树中的冲突
运行gradle dependencies查看完整依赖树,找出是否有第三方依赖间接引入了低版本Servlet API。如果有,通过exclude排除:dependencies { implementation('第三方依赖坐标') { exclude group: 'javax.servlet', module: 'servlet-api' } }检查SmartTomcat插件配置
确认插件指向的Tomcat目录是9.0.64,且未在插件配置中添加额外的冲突依赖,保证项目运行时使用的是Tomcat自带的Servlet API。
内容的提问来源于stack exchange,提问作者Pottie15
相关产品推荐
相关产品推荐

