-  
最近在對接支付寶支付的開發,需要取到支付的RSA公鑰和私鑰。於是把公鑰和私鑰加到resources文件夾里。但是不知道怎么讀到這兩個文件,也就是不知道路徑怎么寫。於是網上搜索了下如何獲取工作路徑,System.getProperty("user.dir"); 用單元測試跑了下,可以拿到Module路徑。

 -  
得到D:\WorkSpace\daikuan\aic\aic-common
aic是project aic-common 是module路徑。然后部署到Tomcat下獲取到的就是D:\Java\apache-tomcat-8.5.8\bin 了,竟然是Tomcat路徑。

 -  
所以使用System.getProperty("user.dir");取項目文件這一招不好使,咨詢其他同事得知可以通過ClassLodaer路徑獲取項目下得文件。getClassLoader代碼如下
 
		public static ClassLoader getClassLoader() {
		    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		
		    if (classLoader == null) {
		        classLoader = PropertiesUtil.class.getClassLoader();
		    }
		    return classLoader;
		}
 
        - getResources返回來的是一個URL 對象集合,不盡友好,但還是可以用,項目結構如下
 

- ClassLoader 並未提供class的路徑,但是提供了getResources用以搜索class下的文件,獲取密鑰的代碼如下
 
	    Enumeration<URL> keyPath= PropertiesUtil.getClassLoader().getResources("resources\\tianping\\private-rsa.pfx");
	    URL url=null;
		String path=null;
	    while(keyPath.hasMoreElements()){
	        url=keyPath.nextElement();
	        System.out.println(url.getPath());
			String path=url.getPath();
	    }
 
        - 返回來的 keyPath 是空的,同事取configuration.properties是沒問題,那么問題應該出在我寫的路徑上。比這時候我去生成的war包里查看了下configuration.properties和tianping文件夾的相對關系,如圖所示

 - configuration.properties就在classes 路徑下,而我放在resources的路徑的天平文件夾也在classes路徑下,大概是Maven打包的原因吧。於是我就直接將"resources\tianping\private-rsa.pfx" 改成了"tianping\private-rsa.pfx"
 - 改完之后打印出來的是這樣一個路徑 
/D:/WorkSpace/daikuan/chexian-axb-service/target/classes/tianping%5cprivate-rsa.pfx。%5 給人感覺是轉過編碼似的,所以我做了個 URLDecoder.decode 解碼得到/D:/WorkSpace/daikuan/chexian-axb-service/target/classes/tianping\private-rsa.pfx竟然出現了這樣的路徑 即含有/ 還含有\。 - 然后用
FileInputStream ksfis = new FileInputStream(path);試了一下是可以訪問的。baidu了下沒有找到關於路徑中同時有/ \的資料,有點摸不着頭腦了。我感覺出現\ 可能會和"tianping\private-rsa.pfx" 有關系,所以我就改成了"tianping/private-rsa.pfx"返回的路徑就正常多了 /D:/WorkSpace/daikuan/chexian-axb-service/target/classes/tianping/private-rsa.pfx 使用FileInputStream也是可以訪問的。 
