idea啟動與jar包啟動中使用resource資源文件路徑的問題
idea啟動與jar包啟動中使用resource資源文件路徑
問題描述
項目直接用idea運行的時候好好的,但是打包成Jar之后卻出現(xiàn)了莫名其妙的BUG,經(jīng)過很長時間的調(diào)試之后,才發(fā)現(xiàn)是打包之后的文件路徑出現(xiàn)了問題。
在原本的代碼中使用的是這樣的代碼來讀取resource中的文件
ClassLoader classLoader = this.class.getClassLoader(); ?? URL appUrl = classLoader.getResource("center/AppStarter.java");? File appJava = new File(appUrl.getFile());
這樣的代碼直接運行時沒問題的,能夠正確的讀取到文件,但是打包成jar之后,
在網(wǎng)上查找了很久,終于找到了解決方法。
讀取resource中的文件需要使用InputStream來進行讀取,然后轉(zhuǎn)換成String。
具體實現(xiàn)可以參看下面的代碼。
//2.創(chuàng)建輸入流 String path = "META-INF/item.xml" InputStream is = this.getClass().getClassLoader().getResourceAsStream(path);
這樣寫了之后打包成jar后能夠成功讀取到resource中的文件
問題分析
在idea中可以通過絕對路徑讀取文件,但是package成jar包之后,路徑的文件形式發(fā)生變化,但是可以通過class路徑,然后通過相對路徑的方式拿到文件流,達到文件內(nèi)容的讀取。
Jar包啟動通過ClassPathResource獲取不到文件路徑
項目目錄結(jié)構(gòu)
maven項目resources目錄也是會被編譯到classpath下的。
ClassPathResource resource = new ClassPathResource("/map/map.properties"); InputStream inputStream = resource.getInputStream(); System.out.println("inputStream.available() = " + inputStream.available()); System.out.println("resource.getFile().getAbsolutePath() = " + resource.getFile().getAbsolutePath());
如果是使用idea進行本地開發(fā)時,是可以獲取到classpath下的資源的路徑的,因為是讀取的磁盤上的真正的那個文件。
但是如果將項目打包成一個jar包后,再獲取map.properties是獲取不到的,對于操作系統(tǒng)來說最多只能讀取到j(luò)ar包,而不能再繼續(xù)讀取jar包里面的文件了,如果繼續(xù)讀取,只能交給jvm去讀了,此時能讀取到二進制流,而不能獲取到路徑。
可通過以下幾種方式獲取classpath下的資源
ClassPathResource classPathResource = new ClassPathResource("/map/map.properties"); InputStream cis = classPathResource.getInputStream(); //獲取classpath下第一個/map/map.properties,這個根據(jù)jar包的加載先后順序有關(guān) InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream("/map/map.properties"); //這個是獲取classpath下所有的map/map.properties,在jvm運行時,所有jar都相當于是一個classpath Enumeration<URL> resources = ClassPathResource.class.getClassLoader().getResources("/map/map.properties");
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-03-03MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn)
在開發(fā)中經(jīng)常遇到多個實體類有共同的屬性字段,這些字段屬于公共字段,本文主要介紹了MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-08-08ServletContext讀取web資源_動力節(jié)點Java學院整理
這篇文章主要介紹了ServletContext讀取web資源,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Java實現(xiàn)Map遍歷key-value的四種方法
本文主要介紹了Java實現(xiàn)Map遍歷key-value的四種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07