Tomcat 9部署WAR包时出现ServletContext.getVirtualServerName()方法找不到错误
Tomcat 9部署WAR包时
NoSuchMethodError问题排查 问题描述
在Windows系统的Tomcat 9上部署Java Servlet WAR包时,触发以下错误:
Caused by: org.apache.catalina.LifecycleException: Failed to start component [NonLoginAuthenticator[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mbas6]]] 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.StandardPipeline.startInternal(StandardPipeline.java:176) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5094) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) ... 37 more Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1355) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 42 more
已确认Tomcat lib目录下的servlet-api.jar包含getVirtualServerName()方法,仍出现报错,可从以下方向排查:
排查要点
- 检查WAR包内的冲突依赖:解压WAR包,查看
WEB-INF/lib目录下是否存在servlet-api.jar或旧版本的javax.servlet-api依赖。这类包会优先于Tomcat自带的API被加载,导致版本不兼容,若存在直接删除。 - 验证JDK版本兼容性:Tomcat 9要求JDK版本≥8,确保
JAVA_HOME环境变量指向符合要求的JDK版本。若使用JDK 9+,需确认模块系统未限制Servlet API的正常加载。 - 检查系统CLASSPATH:若系统CLASSPATH中包含旧版本的Servlet API jar包,会干扰Tomcat的类加载。清空或调整CLASSPATH,移除无关的Servlet依赖项。
- 清理Tomcat缓存:删除Tomcat安装目录下
work文件夹内的所有文件,该目录存储的编译缓存可能残留旧类文件。重启Tomcat后重新部署WAR包。 - 检查Tomcat类加载配置:查看
conf/context.xml或conf/web.xml中的自定义配置,比如antiResourceLocking、privileged等属性,这些可能改变类加载顺序,导致冲突。
内容的提问来源于stack exchange,提问作者Shivam Sharma
相关产品推荐
相关产品推荐

