Java class.getClassLoader().getResource("")獲取資源路徑
Java web專案打包部署時發現出現平時開發過程中沒有出現的錯誤,檢視日誌發現是因為程式碼中
獲取配置檔案路徑有誤。
一、錯誤分析
專案中程式碼:
webRootPath = MySqlDbPoolConnection.class.getClassLoader().getResource("\\").getPath();
webRootPath = new File(webRootPath).getParent();
String profilepath = webRootPath + File.separator + fullFile;
這種方法在開發時獲取到的路徑是
E:\hischarts\service\hischart\target\classes\mysql_db.properties
檢視目錄可知路徑是正確的
而將war包部署到tomcat上獲取到的路徑是
E:\tomcat\apache-tomcat-8.5.15-windows-x64\apache-tomcat-8.5.15\webapps\hischart\WEB-INF\mysql_db.properties
檢視war包解壓後的目錄可知在WEB-INF\後缺少classes\。
所以專案在開發中執行無誤,在部署時執行失敗。
二、檢視原因:
檢視資料專案中獲取資原始檔路徑
方法應該有
1、xxx.class.getClassLoader().getResource(“”).getPath();
獲取src資原始檔編譯後的路徑(即classes路徑)2、xxx.class.getClassLoader().getResource(“檔案”).getPath();
獲取classes路徑下“檔案”的路徑3、xxx.class.getResource(“”).getPath(); 缺少類載入器,獲取xxx類經編譯後的xxx.class路徑
4、this.getClass().getClassLoader().getResource(“”).getPath(); 等方法。
三、測試
測試來獲取這幾個地址:
String str1 = DaoTest.class.getClassLoader ().getResource("").getPath();
String str2 = DaoTest.class.getClassLoader().getResource("\\").getPath();
String str3 = DaoTest.class.getClassLoader().getResource("mysql_db.properties").getPath();
String str1_1 = new File(str1).getParent();
String str2_1 = new File(str2).getParent();
String str3_1 = new File(str3).getParent();
結果:
四、結果分析
分析可知專案中getResource(“\”)也許是想已取巧方式獲取資源路徑,但此方式容易出錯。
從上面結果可以看到在開發時,這種方法確實得到正確路徑,但釋出時使用getResource(“\”)
得到的資源地址是:
/E:/tomcat/apache-tomcat-8.5.15-windows-x64/apache-tomcat-8.5.15/webapps/hischart/WEB-INF/classes/
getParent()後地址為:
E:\tomcat\apache-tomcat-8.5.15-windows-x64\apache-tomcat-8.5.15\webapps\hischart\WEB-INF
可知此時再getparent()就不對了。
所以為了避免這種差別,我們可以直接用
xxx.class.getClassLoader().getResource(“檔名”).getPath();
也可以用
xxx.class.getClassLoader().getResourceAsStream(“檔名”);
直接獲取InputStream