获取NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()

在Tomcat 8中部署服务时遇到问题。出现以下错误:

引起:java.lang.NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()Ljava / lang / String; 在org.apache.tomcat.websocket.server.WsServerContainer。(WsServerContainer.java:149)org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131)org.apache.tomcat.websocket。服务器.WsSci.onStartup(WsSci.java:47)位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)的org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244) ……还有10个

方法getVirtualServerName是在Servlet 3.1中引入的,在从我的servlet-api jar中提取MANIFEST.MF ,我得到了以下细节:

 Specification-Title: Java API for Servlets Specification-Version: 3.1 Specification-Vendor: Sun Microsystems, Inc. Implementation-Title: javax.servlet 

其中说它有3.1。 那么这个错误还有其他原因吗? 请帮忙

检查所有Maven(或等效的)依赖项,并确保您 – 或者很可能是另一个依赖项 – 没有javax.servlet / servlet-api可能优先于Tomcat 8中的内容的javax.servlet / servlet-api的3.1之前的版本。如果您已手动部署,请确保没有手动将任何servlet-api JAR复制到Tomcat本身。

请参阅: https : //stackoverflow.com/a/26232535/954442

方法getVirtualServerName已添加到Servlet 3.1中的ServletContext中。 找到java doc的方法getVirtualServerName

这个问题可能至少有3个原因:

  1. 你的servlet版本比3.1更旧。

  2. 其他jar的servlet版本比3.1旧。

  3. 你的tomcat版本早于8

要解决它,你可以尝试以下方式。

I.检查你的pom.xml是否有以下代码。

   javax.servlet javax.servlet-api 3.1.0  

如果你的pom.xml有上面的代码,它仍然会有这个问题。 你可以做第二种方式。

II。 检查你的其他jar有没有引用javax.servlet-api jar。 例如, org.apache.santuario引用了javax.servlet-api jar。 pom.xml:

  org.apache.santuario xmlsec 1.4.3  

但是当你看到maven依赖项时,它会引用javax.servlet-api jar,它的版本比2.3早于2.3。

在此处输入图像描述

所以你应该排除2.3版本。 pom.xml中:

   org.apache.santuario xmlsec 1.4.3   javax.servlet servlet-api      javax.servlet javax.servlet-api 3.1.0  

III。 spring boot运行默认的tomcat 7.所以定义你的tomcat版本8而不是tomcat 7.所以添加代码你的pom.xml:

   UTF-8 UTF-8 1.8 8.5.5  

更新IntelliJ后,我在使用maven的IntelliJ上出现此错误。

我可以用maven运行测试但不能从我的IDE运行。

我通过删除./ideaproject.iml文件并重新加载项目来解决问题。

Spring启动默认运行tomcat 7 ,你必须在pom.xml中覆盖maven build tomcat.version。 请参阅下文以运行tomcat 8.0.30

  8.0.30  

应该解决你的问题。

解决了我的mac与Java 8面临从网站下载tomcat和解压缩的问题。

我的问题得到了解决,因为有一个额外的servlet-api.jar文件被拿起来了。 它来自/Library/Java/Extensions/servlet-api.jar

要在系统中找到它,可以使用sudo find / -name servlet-api.jar

通过在其他地方备份来删除它。

我正在关注这个安装https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32

在经历了所有这些堆栈溢出的巨大痛苦和筛选之后,唯一最终为我工作的是从tomcat8降级到tomcat7。 我知道这不是一个理想的解决方案,也许它只是一个全新的tomcat安装解决了我的问题。 如果所有其他方法都失败了那就试试看。

这肯定与javax.servlet的版本和Tomcat的版本有关。

在我的情况下,当我在没有版本的gradle中声明javax.servlet依赖时,它就消失了。 喜欢这个 –

 compile('javax.servlet:servlet-api')