簡體   English   中英

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

[英]Getting NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()

我在 Tomcat 中部署服務時遇到問題 8. 出現以下錯誤:

引起: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) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase1:89215850)...

方法getVirtualServerName是在 Servlet 3.1 中引入的,在從我的servlet-api jar 中提取MANIFEST.MF后,我得到了以下詳細信息:

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

其中說它有 3.1。 那么這個錯誤還有其他原因嗎? 請幫忙

檢查您所有的 Maven(或等效的)依賴項,並確保您 - 或者很可能是另一個依賴項 - 沒有javax.servlet / servlet-api的 3.1 之前版本,該版本可能優先於 Tomcat 8 中的內容. 如果您已手動部署,請確保您沒有將任何 servlet-api JAR 手動復制到 Tomcat 本身。

參見: https : //stackoverflow.com/a/26232535/954442

在 Servlet 3.1 的 ServletContext 中添加了getVirtualServerName方法。 請參閱 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 有上面的代碼,它仍然會有這個問題。 你可以用第二種方法。

二、 要檢查您的其他 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 早於 3.1。

在此處輸入圖片說明

所以你應該排除 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 version 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 運行。

我通過刪除./ideaproject.iml文件並重新加載項目解決了這個問題。

如果您使用了此依賴項:

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

Spring boot 將默認運行tomcat 7 ,您必須在 pom.xml 中覆蓋 maven build tomcat.version。 見下文運行tomcat 8.0.30

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

應該解決你的問題。

解決了在我的帶有 java 8 的 mac 上遇到了從站點下載的 tomcat 並解壓縮的問題。

我的問題得到了解決,因為有一個額外的 servlet-api.jar 文件正在被提取。 它來自 /Library/Java/Extensions/servlet-api.jar

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

通過將其備份到其他地方來刪除它。

我正在關注這個安裝https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32

假設您在 Eclipse 中運行應用程序時出現此問題。 使用 Dependency Hierarchy 視圖在 pom.xm 中搜索 servlet-api

在經歷了巨大的痛苦並篩選了所有這些 stackoverflow 答案之后,最終對我有用的唯一一件事就是從 tomcat8 降級到 tomcat7。 我知道這不是一個理想的解決方案,也許只是全新安裝的 tomcat 解決了我的問題。 如果所有其他方法都失敗了,請試一試。

我附上gradle樣式依賴代碼。

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

這肯定與javax.servlet的版本和Tomcat的版本有關。

就我而言,當我在沒有版本的 gradle 中聲明 javax.servlet 依賴項時,它就消失了。 像這樣 -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM