Caused by: java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN


這個是很早以前的一個bug了,最近開始用idea發現追源碼相當方便,於是結合網上的解決方案以及自己的判斷追蹤一下原因,當然沒有深究,只是根據提示一直追而已;先說一下解決方案:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

  根據異常提示發現Can't find bundle for base name這個是jdk的資源綁定類拋出的,根據提示bundle XXX基本上是個資源文件,推測在綁定這個資源文件沒有找到,搜索 avax.servlet.LocalStrings 發現在javaee-api中,如圖:

 
         
package javax.servlet;

public
abstract class ServletOutputStream extends OutputStream { private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
  //這個調用jdk的方法沒有取到報錯了
private static ResourceBundle lStrings = ResourceBundle.getBundle(LSTRING_FILE);

看看名字取得XX_file,說明在javax/servlet/下應該有個文件叫 LocalStrings ,直接進行文件搜索,果然在下載的javaee-api源碼文件中找到了,但是打成jar包的文件中卻沒有(原因不深究)。

這時候網上搜索了一下,有人說直接把tomcat的jar包引入,用到了web相關的jar(事后諸葛一下:tomcat本身就是一個servelet容器,javaee-api不可能調tomcat的私有jar,從上面的package也能看出跟servlet有關),引入發現果然可以;

這時候看到了另外一個文章,寫得就是開頭的解決方案,直接引入 javax.servlet-api ,問題解決了,驗證一下,說明引入的這個servelt-api肯定有這個文件,搜索一下果然有,同時發現javaee-api和 javax.servlet-api里面有些全類限定名一模一樣的類,比如上面的

ServletOutputStream,應該是出於一些考慮,這個時候想兩個一模一樣的類如何調用,不會沖突嗎?根據加載的一些規則,比如都在pom中以jar包形式依賴 ,只要調整順序即可(已驗證)由於文件已經存在了,不影響調用;貼一下兩個jar包的目錄,如下:

 

 

 
       


免責聲明!

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



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