1. 程式人生 > >Java class.getClassLoader().getResource("")獲取資源路徑

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