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

Reh*_*man 25 java servlets tomcat8

在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. server.WsSci.onStartup(WsSci.java:47)在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244)在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ......还有10个

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

Specification-Title: Java API for Servlets 
Specification-Version: 3.1 
Specification-Vendor: Sun Microsystems, Inc. 
Implementation-Title: javax.servlet 
Run Code Online (Sandbox Code Playgroud)

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

And*_*gan 17

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

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

  • 使用命令mvn dependency:tree从项目根目录中的命令行中找到带来servlet-api jar的违规依赖项,最有可能搜索输出中的servlet-api 2.版本,将其从您的pom中包含以下内容的依赖项中排除.{<exclusion> <artifactId> servlet-api </ artifactId> <groupId> javax.servlet </ groupId> </ exclusion>} (2认同)

Jav*_*all 14

该方法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>
Run Code Online (Sandbox Code Playgroud)

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

II.检查你的其他jar有没有参考javax.servlet-apijar.例如,org.apache.santuario它指的是javax.servlet-apijar.pom.xml:

<dependency>  
    <groupId>org.apache.santuario</groupId>  
    <artifactId>xmlsec</artifactId>  
    <version>1.4.3</version>   
</dependency> 
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

所以你应该排除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> 
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

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


yue*_*n26 5

如果你使用过这个依赖:

<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-jetty</artifactId>
    <version>1.23.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

那么请排除如下:

<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-jetty</artifactId>
    <version>1.23.0</version>
    <exclusions>
        <exclusion>
            <artifactId>servlet-api</artifactId>
            <groupId>org.mortbay.jetty</groupId>
        </exclusion>
    </exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)