在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。那么这个错误还有其他原因吗?请帮忙
检查所有Maven(或等效的)依赖项,并确保您 - 或者很可能是另一个依赖项 - 没有引入可能优先于Tomcat 8中的javax.servlet / servlet-api
的3.1版之前的版本。如果您手动操作已部署,请确保您没有手动将任何servlet-api JAR复制到Tomcat本身。
方法getVirtualServerName
已添加到Servlet 3.1中的ServletContext中。找到java doc的方法getVirtualServerName
这个问题可能至少有3个原因:
要解决它,你可以尝试以下方式。
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。
所以你应该排除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>
更新IntelliJ后,我在使用maven的IntelliJ上出现此错误。
我可以用maven运行测试,但不能从我的IDE运行。
我通过删除./idea
和project.iml
文件并重新加载项目解决了这个问题。
Spring默认运行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文件被拿起来了。它来自/Library/Java/Extensions/servlet-api.jar
要在系统中找到它,可以使用sudo find / -name servlet-api.jar
通过在其他地方备份来删除它。
我正在关注这个安装qazxsw poi
在经历了所有这些stackoverflow的巨大痛苦和筛选之后,唯一最终为我工作的是从tomcat8降级到tomcat7。我知道这不是一个理想的解决方案,也许只是一个全新的tomcat安装解决了我的问题。如果所有其他方法都失败了那就试试看。
这肯定与javax.servlet的版本和Tomcat的版本有关。
在我的情况下,当我在没有版本的gradle中声明javax.servlet依赖时它就消失了。像这样 -
https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32