這個是很早以前的一個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包的目錄,如下:


