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

Getting NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()

提问人:Rahman 提问时间:1/22/2016 最后编辑:Rahman 更新时间:9/22/2023 访问量:78097

问:

我在 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

方法在 Servlet 3.1 中引入,从我的 jar 中提取后,我得到了以下详细信息:getVirtualServerNameMANIFEST.MFservlet-api

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

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

Java Servlet tomcat8

评论

0赞 MrSimpleMind 1/22/2016
你逃避 Eclipse 吗?或。。。请让我们详细了解您的环境、应用程序和设置。
0赞 Andrew Regan 1/22/2016
您肯定在使用 Tomcat 8 吗?您的帖子被标记为“tomcat7”...
0赞 Rahman 1/22/2016
@AndrewRegan 对不起,这是一个错误。我编辑了。我正在使用 tomcat 8
1赞 MrSimpleMind 1/22/2016
我也在想什么,这就是为什么我问环境......你使用pom.xml吗?也许您应该将属性更改为 xxxx 到 Tomcat 8...?<tomcat.version></tomcat.version>
0赞 Rahman 1/22/2016
@MrSimpleMind 是的,我正在使用 POM。但我没有宣布.那么,如果我不声明默认情况下会采取什么措施?<tomcat.version>

答:

27赞 Andrew Regan 1/22/2016 #1

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

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

评论

6赞 user1412523 8/21/2017
使用命令 mvn dependency:tree 从项目根目录的命令行找到在 maven 中引入 servlet-api jar 的违规依赖项,在输出中搜索最有可能的 servlet-api 2.?版本,将其从依赖项中排除,并具有 POM 中的以下内容。{ <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion>}
0赞 A.W. 9/8/2018
@user1412523谢谢!这为我解决了这个问题。我的依赖是我删除了它,因为我无论如何都不需要它,它又开始工作了。google-oauth-client-jetty
0赞 Fabich 6/4/2019
我的依赖项是hadoop-common(2.9.2)
0赞 kinjelom 3/30/2020
mvn dependency:tree | grep servlet-api
0赞 Sir Beethoven 5/4/2020
谢谢@user1412523,这是一个非常有用的评论。我终于可以修复我的 apache fop-transcoder-allinone 2.4 依赖项,现在可以继续前进了。
4赞 MrSimpleMind 1/22/2016 #2

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

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

应该解决你的问题。

2赞 Ankur 6/29/2017 #3

解决在我的 mac 上使用 java 8 时,从站点下载并解压缩 tomcat 时遇到了问题。

我的问题得到了解决,因为有一个额外的servlet-api.jar文件被拾取了。它来自: /资源库/Java/Extensions/servlet-api.jar

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

通过将其备份到其他地方将其删除。

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

10赞 zlandorf 8/8/2017 #4

更新 IntelliJ 后,我在 IntelliJ 上使用 maven 时遇到了这个错误。

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

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

-1赞 Do Will 11/8/2017 #5

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

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

compile('javax.servlet:servlet-api')
22赞 Python Basketball 11/27/2017 #6

该方法已添加到 Servlet 3.1 的 ServletContext 中。请参阅 java 文档的方法 getVirtualServerNamegetVirtualServerName

此问题有 3 个主要原因:

  1. 您的 servlet 版本低于 3.1。

  2. 其他一些 jar 具有版本低于 3.1 的 servlet。

  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. 要检查您的其他罐子是否参考了罐子。例如,has 指的是 jar。pom.xml:javax.servlet-apiorg.apache.santuariojavax.servlet-api

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

但是,当您查看 Maven 依赖项时,它指的是版本早于 3.1 的 2.3 的 JAR。javax.servlet-api

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> 

三、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>

评论

0赞 senyor 9/4/2019
可以不排除传递依赖项,而只需包含正确的版本。Maven 采用图中更接近的那个。
0赞 user2008914 9/5/2018 #7

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

5赞 yuen26 8/31/2019 #8

如果您已使用此依赖项:

<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-jetty</artifactId>
    <version>1.23.0</version>
</dependency>

那么请排除如下:

<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>

评论

0赞 Rigoxls 11/28/2020
太好了,这正是我的错误,你怎么知道的??
0赞 yuen26 11/28/2020
@Rigoxls我记得我在使用 Google 客户端 API 和 Spring Framework 时遇到了这个问题
1赞 Max Wang 7/16/2020 #9

假设在Eclipse中运行应用程序时出现此问题。 使用 Dependency Hierarchy 视图在 pom.xm 中搜索 servlet-api

0赞 seunggabi 5/6/2022 #10

我附上了样式依赖项代码。gradle

dependencies {
    compileOnly("javax.servlet:javax.servlet-api:3.1.0")

评论

1赞 Mark Rotteveel 5/7/2022
请不要只发布代码作为答案,还要解释你的代码是做什么的,以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引赞成票。
0赞 Alan Ackart 9/22/2023 #11

就我而言,我添加了 vm 选项来查找错误的 jar 和 排除冲突的 jar,然后添加 javax.servlet-api(3.1.0) 的 Higer 版本,问题就解决了。-verbose:class