web-dev-qa-db-ja.com

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でorg.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5244)at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)のserver.WsSci.onStartup(WsSci.Java:47) ... 10その他

メソッドgetVirtualServerNameはサーブレット3.1で導入され、MANIFEST.MF 私から servlet-api jar私は次の詳細を得た:

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

それは3.1を持っていると言います。このエラーには他の理由がありますか?助けてください

23
Rehman

すべてのMaven(または同等の)依存関係を確認し、Tomcat 8の内容よりも優先される可能性のあるjavax.servlet / servlet-apiの3.1以前のバージョンを使用していないことを確認します。手動でデプロイした場合は、サーブレットAPI JARをTomcat自体に手動でコピーしていないことを確認してください。

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

16
Andrew Regan

メソッドgetVirtualServerNameがServlet 3.1のServletContextに追加されました。 Java docのメソッド getVirtualServerName を見つけます

この問題には、少なくとも3つの原因が考えられます。

  1. サーブレットのバージョンが3.1より古い。

  2. 他のjarには、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に上記のコードが含まれている場合でも、その問題が残っています。 2番目の方法を実行できます。

II。他のjarを確認するには、javax.servlet-api jarを参照します。たとえば、org.Apache.santuariojavax.servlet-api jarを参照しています。 pom.xml:

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

しかし、Mavenの依存関係を見ると、バージョンが2.3より古いjavax.servlet-api jarを参照しています。

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> 

III。 SpringブートはデフォルトのTomcat 7を実行します。そのため、Tomcat 7ではなくTomcatバージョン8を定義します。そのため、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>
11
Dang

IntelliJを更新した後、Mavenを使用するIntelliJでこのエラーが発生しました。

私はIDEからではなく、mavenでテストを実行できました。

./ideaおよびproject.imlファイルを削除してプロジェクトをリロードすることで問題を解決しました。

6
zlandorf

Solved私のMacではJava 8は、サイトからダウンロードしたTomcatの問題に直面し、解凍しました。

追加のservlet-api.jarファイルが取得されていたため、私の問題は解決しました。 /Library/Java/Extensions/servlet-api.jarから来ていた

システムで見つけるには、Sudo find/-name servlet-api.jarを使用できます

別の場所にバックアップして削除しました。

私はこれをインストールのためにフォローしていました https://Gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32

2
Ankur

SpringブートはTomcat 7をデフォルトで実行します。pom.xmlでmavenビルドTomcat.versionをオーバーライドする必要があります。以下を参照して実行してくださいTomcat 8.0.

<properties>
  <Tomcat.version>8.0.30</Tomcat.version>
</properties>

問題を解決する必要があります。

2
MrSimpleMind

この依存関係を使用した場合:

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

これらのstackoverflowの答えをすべて苦労してふるい分けた後、私にとってうまくいったのはTomcat8からTomcat7にダウングレードすることだけでした。これは理想的なソリューションではないことはわかっています。おそらく、Tomcatを新しくインストールしただけで問題が解決したのでしょう。他のすべてが失敗した場合、それを試してみてください。

0
user2008914