提问人:Rahman 提问时间:1/22/2016 最后编辑:Rahman 更新时间:9/22/2023 访问量:78097
获取 NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()
Getting 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.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 中提取后,我得到了以下详细信息:getVirtualServerName
MANIFEST.MF
servlet-api
Specification-Title: Java API for Servlets
Specification-Version: 3.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet
这说它有 3.1。那么这个错误还有其他原因吗?请帮忙
答:
检查所有 Maven(或等效)依赖项,并确保您(或很可能是其他依赖项)没有引入可能优先于 Tomcat 8 中的 3.1 之前版本。如果您已手动部署,请确保您没有手动将任何 servlet-api JAR 复制到 Tomcat 本身。javax.servlet / servlet-api
请参见:https://stackoverflow.com/a/26232535/954442
评论
google-oauth-client-jetty
mvn dependency:tree | grep servlet-api
Spring Boot 将默认运行 tomcat 7,您必须在 pom.xml 中覆盖 maven build tomcat.version。请参阅下文以运行 tomcat 8.0.30
<properties>
<tomcat.version>8.0.30</tomcat.version>
</properties>
应该解决你的问题。
解决在我的 mac 上使用 java 8 时,从站点下载并解压缩 tomcat 时遇到了问题。
我的问题得到了解决,因为有一个额外的servlet-api.jar文件被拾取了。它来自: /资源库/Java/Extensions/servlet-api.jar
要在您的系统中查找它,您可以使用 sudo 查找 / -name servlet-api.jar
通过将其备份到其他地方将其删除。
我正在关注这个安装 https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32
更新 IntelliJ 后,我在 IntelliJ 上使用 maven 时遇到了这个错误。
我可以使用 maven 运行测试,但不能从我的 IDE 运行。
我通过删除 and 文件并重新加载项目来解决问题。./idea
project.iml
这肯定与 javax.servlet 的版本和 Tomcat 的版本有关。
就我而言,当我在没有版本的情况下在 gradle 中声明 javax.servlet 依赖项时,它就消失了。喜欢这个-
compile('javax.servlet:servlet-api')
该方法已添加到 Servlet 3.1 的 ServletContext 中。请参阅 java 文档的方法 getVirtualServerName。getVirtualServerName
此问题有 3 个主要原因:
您的 servlet 版本低于 3.1。
其他一些 jar 具有版本低于 3.1 的 servlet。
您的 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-api
org.apache.santuario
javax.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
因此,您应该排除 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>
评论
在经历了巨大的痛苦和筛选所有这些stackoverflow答案之后,最终唯一对我有用的就是从tomcat8降级到tomcat7。我知道这不是一个理想的解决方案,也许只是全新安装的 tomcat 解决了我的问题。如果一切都失败了,那就试一试吧。
如果您已使用此依赖项:
<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>
评论
假设在Eclipse中运行应用程序时出现此问题。 使用 Dependency Hierarchy 视图在 pom.xm 中搜索 servlet-api
我附上了样式依赖项代码。gradle
dependencies {
compileOnly("javax.servlet:javax.servlet-api:3.1.0")
评论
就我而言,我添加了 vm 选项来查找错误的 jar 和
排除冲突的 jar,然后添加 javax.servlet-api(3.1.0) 的 Higer 版本,问题就解决了。-verbose:class
评论
<tomcat.version>
</tomcat.version>
<tomcat.version>