SpringBoot報錯:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/l

錯誤: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

     image

 

二.若是知道項目引入了別的Servlet-api,排除步驟,僅供參考,每一個人均可能不同!   

image

     能夠查看項目的依賴,很明顯發現了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 來查看依賴圖

image

 

老實說在下面這麼大的網狀圖裏找到servlet-api的jar,確實有點困難,先說找到後咋辦吧,在servlet-api上右鍵exclude(快捷鍵Shift+Delete),便可排除這個版本的servlet-api;

既然找到這個這麼困難,還有一種最直接的解決方案:若是項目使用的SpringBoot內嵌的Tomcat,手動添加一個Servlet-api 3.1放到Dependencies裏最前面,也能夠解決問題.

image

 

強烈any一款IDEA插件,誰用誰知道,我也是今天才發現! Maven Helper

 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>
相關文章
相關標籤/搜索