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を持っていると言います。このエラーには他の理由がありますか?助けてください
すべてのMaven(または同等の)依存関係を確認し、Tomcat 8の内容よりも優先される可能性のあるjavax.servlet / servlet-api
の3.1以前のバージョンを使用していないことを確認します。手動でデプロイした場合は、サーブレットAPI JARをTomcat自体に手動でコピーしていないことを確認してください。
メソッドgetVirtualServerName
がServlet 3.1のServletContextに追加されました。 Java docのメソッド getVirtualServerName を見つけます
この問題には、少なくとも3つの原因が考えられます。
サーブレットのバージョンが3.1より古い。
他のjarには、3.1より古いバージョンのサーブレットがあります。
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.santuario
はjavax.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を参照しています。
したがって、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>
IntelliJを更新した後、Mavenを使用するIntelliJでこのエラーが発生しました。
私はIDEからではなく、mavenでテストを実行できました。
./idea
およびproject.iml
ファイルを削除してプロジェクトをリロードすることで問題を解決しました。
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
SpringブートはTomcat 7をデフォルトで実行します。pom.xmlでmavenビルドTomcat.versionをオーバーライドする必要があります。以下を参照して実行してくださいTomcat 8.0.
<properties>
<Tomcat.version>8.0.30</Tomcat.version>
</properties>
問題を解決する必要があります。
この依存関係を使用した場合:
<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>
これらのstackoverflowの答えをすべて苦労してふるい分けた後、私にとってうまくいったのはTomcat8からTomcat7にダウングレードすることだけでした。これは理想的なソリューションではないことはわかっています。おそらく、Tomcatを新しくインストールしただけで問題が解決したのでしょう。他のすべてが失敗した場合、それを試してみてください。