2016-01-22 80 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>