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

问题描述 投票:21回答:7

在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中引入的,从我的MANIFEST.MF jar中提取servlet-api后,我得到了以下细节:

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

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

java servlets tomcat8
7个回答
16
投票

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

见:https://stackoverflow.com/a/26232535/954442


10
投票

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

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

  1. 你的servlet版本比3.1更旧。
  2. 其他jar的servlet版本比3.1旧。
  3. 你的tomcat版本早于8

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

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

  <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.1.0</version>
    </dependency>

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

II。检查你的其他jar已经参考javax.servlet-api jar。例如,org.apache.santuario指的是javax.servlet-api jar。 pom.xml:

<dependency>  
    <groupId>org.apache.santuario</groupId>  
    <artifactId>xmlsec</artifactId>  
    <version>1.4.3</version>   
</dependency> 

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

enter image description here

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

<!-- exclude servlet-api 2.3 jar-->  
<dependency>  
    <groupId>org.apache.santuario</groupId>  
    <artifactId>xmlsec</artifactId>  
    <version>1.4.3</version>  
    <exclusions>  
        <exclusion>  
            <groupId>javax.servlet</groupId>  
            <artifactId>servlet-api</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency>  

<!-- servlet-api 3.1 version has getVirtualServerName() -->  
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>3.1.0</version>  
</dependency> 

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

   <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <tomcat.version>8.5.5</tomcat.version>
    </properties>

6
投票

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

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

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


2
投票

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

<properties>
  <tomcat.version>8.0.30</tomcat.version>
</properties>

应该解决你的问题。


2
投票

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

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

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

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

我正在关注这个安装qazxsw poi


0
投票

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


-1
投票

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

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

https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32
© www.soinside.com 2019 - 2024. All rights reserved.