![](/img/trans.png)
[英]Spring - Oauth2 Client server. NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName() While running in tomcat
[英]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 本身。
在 Servlet 3.1 的 ServletContext 中添加了getVirtualServerName
方法。 請參閱 java 文檔的方法getVirtualServerName 。
此問題有 3 個主要原因:
您的 servlet 版本早於 3.1。
其他一些 jar 的 servlet 版本早於 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 有上面的代碼,它仍然會有這個問題。 你可以用第二種方法。
二、 要檢查您的其他 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 運行。
我通過刪除./idea
和project.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.