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


錯誤:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;

   

    最近剛剛開始用SpringBoot做項目,之前項目跑得好好的,就啟動不起來了,后來終於解決了這個錯誤,這種錯誤出現原因很多吧,我這只能算一種原因。

    直接進入正題,我遇到的導致出現這個報錯的原因:maven項目中引入了多個版本的servlet-api的jar包,項目加載時候加載錯了類(加載到servlet-api包中的類),getVirtualServerName我只在SpringBoot內嵌的Tomcat的包里見到了!

    解決方案:Servlet-api 3.1.0以及之后的版本中才有getVirtualServerName,確保項目中使用的是這個版本3.1.0以及之后,或者直接排除所有Servlet-api,使用SpringBoot內嵌的tomcat.

 

 

一.SpringBoot版本是2.0.0 ,該版本下內嵌Tomcat的jar中就使用了自己的ServletContext,官方文檔中標注了該方法在servlet-api 3.1.0才出現,我下載了3.1-b01也是沒有該方法的! 所以意味着我們項目如果用了Servlet-api,那版本不得低於3.1.0

     image

 

二.如果知道項目引入了別的Servlet-api,排除步驟,僅供參考,每個人都可能不一樣!   

image

     可以查看項目的依賴,很明顯發現了servlet-api 2.3 的版本,注意這可能不是你自己引入的(自己引入的解決方法就不用我說了,自己刪掉dependency),別的項目引入的話,解決起來就可以參考下面的步驟。

     我也不太了解maven類加載機制,所以說下我覺得可能出現的幾個問題,出現這個錯誤我認為就是加載的是Servlet-api 3.1.0之前的版本(和當前SpringBoot版本不匹配),項目中正好因為我把

axis-saaj的依賴放在了pom文件依賴最前面,而axis-saaj依賴中正好包含了servlet-api的jar,而且用的版本是2.3.0;  如果我將axis-saaj的依賴放在pom依賴最后面,容器又可以正常啟動起來

了!

 

 

三.我們就按照axis-saaj在最前面,我們不知道哪個依賴用了servlet-api的情況來排錯! jar包那么多,依賴那么多,這次偶然,下次呢?

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>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM