錯誤:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;html
最近剛剛開始用SpringBoot作項目,以前項目跑得好好的,就啓動不起來了,後來終於解決了這個錯誤,這種錯誤出現緣由不少吧,我這隻能算一種緣由。java
直接進入正題,我遇到的致使出現這個報錯的緣由:maven項目中引入了多個版本的servlet-api的jar包,項目加載時候加載錯了類(加載到servlet-api包中的類),getVirtualServerName我只在SpringBoot內嵌的Tomcat的包裏見到了!api
解決方案:Servlet-api 3.1.0以及以後的版本中才有getVirtualServerName,確保項目中使用的是這個版本3.1.0以及以後,或者直接排除全部Servlet-api,使用SpringBoot內嵌的tomcat.tomcat
一.SpringBoot版本是2.0.0 ,該版本下內嵌Tomcat的jar中就使用了本身的ServletContext,官方文檔中標註了該方法在servlet-api 3.1.0纔出現,我下載了3.1-b01也是沒有該方法的! 因此意味着咱們項目若是用了Servlet-api,那版本不得低於3.1.0maven
能夠查看項目的依賴,很明顯發現了servlet-api 2.3 的版本,注意這可能不是你本身引入的(本身引入的解決方法就不用我說了,本身刪掉dependency),別的項目引入的話,解決起來就能夠參考下面的步驟。ide
我也不太瞭解maven類加載機制,因此說下我以爲可能出現的幾個問題,出現這個錯誤我認爲就是加載的是Servlet-api 3.1.0以前的版本(和當前SpringBoot版本不匹配),項目中正好由於我把ui
axis-saaj的依賴放在了pom文件依賴最前面,而axis-saaj依賴中正好包含了servlet-api的jar,並且用的版本是2.3.0; 若是我將axis-saaj的依賴放在pom依賴最後面,容器又能夠正常啓動起來spa
了!插件
三.咱們就按照axis-saaj在最前面,咱們不知道哪一個依賴用了servlet-api的狀況來排錯! jar包那麼多,依賴那麼多,此次偶然,下次呢?code
POM文件中咱們右擊 Diagram---》 Show Dependencies 來查看依賴圖
老實說在下面這麼大的網狀圖裏找到servlet-api的jar,確實有點困難,先說找到後咋辦吧,在servlet-api上右鍵exclude(快捷鍵Shift+Delete),便可排除這個版本的servlet-api;
既然找到這個這麼困難,還有一種最直接的解決方案:若是項目使用的SpringBoot內嵌的Tomcat,手動添加一個Servlet-api 3.1放到Dependencies裏最前面,也能夠解決問題.
Maven Helper安裝方式就不介紹了,IDEA settings Plugin中搜索 Maven Helper,安裝、重啓就可使用了. 直接上圖,怎麼解決這種jar衝突的問題
Maven Helper使用方式: 安裝成功之後,打開POM文件,紅色箭頭中內容出現就是安裝成功.
切換到依賴分析面板,Dependency Analyzer,而後搜索衝突的jar,在All Dependency界面就能夠Exclude,很方便的找到衝突的jar,servlet-api 2.3排除掉,是否是很好很強大呢?
綜上來看,最優的解決方案是在<Dependencies>下添加Servlet-api 3.1的依賴,最爲直接、暴力。此外,也強烈給你們介紹了Maven Helper插件排除jar依賴的方法
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>