2016-01-22 82 views
9

我在Tomcat中8服务的部署过程中面临的一个问题入门以下错误:入门的NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()

Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.tomcat.websocket.server.WsServerContainer.(WsServerContainer.java:149) at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 10 more

方法getVirtualServerName中的Servlet 3.1和提取后,导入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的。那么这个错误还有其他原因吗?请帮助

+0

你是否从eclipse运行?或...请让我们更多地了解您的环境,应用程序和设置。 – MrSimpleMind

+0

您确定使用Tomcat 8吗?您的文章被标记为'tomcat7'... –

+0

@AndrewRegan对不起,这是一个错误。我编辑过。我正在使用tomcat 8 – Rehman

回答

8

检查您的所有Maven(或同等)依赖关系,并确保您 - 或最有可能的另一个依赖关系 - 不会在3.132之前版本的javax.servlet/servlet-api中优先于Tomcat 8中的内容。如果你已经手动部署,确保你没有手动拷贝任何servlet-api JAR到Tomcat本身。

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

+0

找到引发maven中的servlet-api jar的命令mvn dependency:tree,从项目根目录的命令行中找到违规的依赖项,搜索servlet-api的输出,它最有可能是2.?版本,将其从您的pom中的以下依赖项中排除。 { servlet的API 的javax.servlet } – user1412523

2

春天开机运行的Tomcat 7每默认情况下,你必须覆盖Maven构建tomcat.version在你的pom.xml。见下面运行的Tomcat 8.0.30

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

应该解决您的问题。

2

已解决 在我的mac上,用java 8正面临着从站点下载的tomcat和unzip的问题。

我的问题得到解决,因为有一个额外的servlet-api.jar文件被拾取。这是从 /Library/Java/Extensions/servlet-api.jar

对于即将在您的系统找到它,你可以使用 须藤查找/ -name的servlet-api.jar文件

删除它通过支持它在别的地方。

我下面这个用于安装纸 https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32

3

我有这个错误的IntelliJ上使用Maven的IntelliJ更新后。

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

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

-1

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

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

compile('javax.servlet:servlet-api') 
2

方法getVirtualServerName已被添加到ServletContext中的Servlet 3.1中。找到Java文档的方法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有上面的代码,它仍然会有这个问题。你可以做第二种方式。

二,检查你的另一个罐子是否参考了罐子的javax.servlet-api。例如,org.apache.santuario指的是javax.servlet-api罐子。 pom.xml中:

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

,但是当你在Maven的依赖关系,它指的是javax.servlet-api罐子,其版本比3.1年长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> 

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