Java項目訪問resources文件

  • 最近在對接支付寶支付的開發,須要取到支付的RSA公鑰和私鑰。因而把公鑰和私鑰加到resources文件夾裏。可是不知道怎麼讀到這兩個文件,也就是不知道路徑怎麼寫。因而網上搜索了下如何獲取工做路徑,System.getProperty("user.dir"); 用單元測試跑了下,能夠拿到Module路徑。
    1
  • 獲得D:\WorkSpace\daikuan\aic\aic-common
    aic是project aic-common 是module路徑。而後部署到Tomcat下獲取到的就是D:\Java\apache-tomcat-8.5.8\bin 了,居然是Tomcat路徑。
    2java

  • 因此使用System.getProperty("user.dir");取項目文件這一招很差使,諮詢其餘同事得知能夠經過ClassLodaer路徑獲取項目下得文件。getClassLoader代碼以下apache

public static ClassLoader getClassLoader() {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        
            if (classLoader == null) {
                classLoader = PropertiesUtil.class.getClassLoader();
            }
            return classLoader;
        }
  • getResources返回來的是一個URL 對象集合,不盡友好,但仍是能夠用,項目結構以下

3

  • 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文件夾的相對關係,如圖所示
    4
  • 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也是能夠訪問的。
相關文章
相關標籤/搜索