解讀classpath讀取resources目錄下的文件
classpath讀取resources目錄下文件
最近在springboot+maven的項(xiàng)目中去讀取資源文件的時(shí)候,報(bào)了找不到文件的錯(cuò)誤。
由此展開了對(duì)maven項(xiàng)目編譯前和編譯后的目錄結(jié)構(gòu)的了解,以及對(duì)java的classpath的理解。
首先:
由Maven構(gòu)建的web工程,java代碼放在src/main/java路徑下,資源(配置文件等)放在src/main/resources路徑下,當(dāng)構(gòu)建jar包 或 war包時(shí),JVM虛擬機(jī)會(huì)自動(dòng)編譯java文件為class文件存放在 target/classes目錄下,resource資源下的文件會(huì)原封不動(dòng)的拷貝一份到 target/classes 目錄下:而我們一般取的classpath就是target/classes目錄
你可以通過這種方式打印你的calsspath
A.class.getClassLoader().getResource("").getPath();
這里又引出一個(gè)話題,我們可以根據(jù)兩種不同的方式去獲取Resources下的文件
1、class.getResource()
import org.junit.jupiter.api.Test; public class ResourceTestDemo { @Test void getResourceTest(){ System.out.println(ResourceTestDemo.class.getResource("")); System.out.println(ResourceTestDemo.class.getResource("/")); }
打印結(jié)果:
1、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/3.txt
2、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/test/2.txt
結(jié)果分析:
- 1、getResource("")不帶"/“時(shí)候是從當(dāng)前類所在包路徑去獲取資源
- 2、getResource("/")帶”/"時(shí)候是從classpath的根路徑獲取
2、getClassLoader().getResource()
@Test void getClassLoaderResourceTest(){ System.out.println(ResourceTestDemo.class.getClassLoader().getResource("")); System.out.println(ResourceTestDemo.class.getClassLoader().getResource("/")); }
打印結(jié)果:
file:/Users/qinzhen/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/test-classes/
null
class.getResource()
不帶"/"時(shí)候是從當(dāng)前類所在包路徑去獲取資源class.getResource()
帶"/"時(shí)候是從classpath的根路徑獲取class.getResource()
本質(zhì)上也是調(diào)用了getClassLoader,只是封裝了一層方便了我們使用而已getClassLoader().getResource("")
不帶"/"時(shí)候是從classpath的根路徑獲取getClassLoader().getResource("/")
路徑中無法帶有"/"getResourceAsStream()
方法僅僅是獲取對(duì)應(yīng)路徑文件的輸入流,在路徑的用法上與getResource()一qu
4、批量讀取
如果想要批量讀區(qū)resource下的文件呢?
Resource[] resources = ResourceTestDemo.class.getClassLoader().getResources("validator-config/*.xml"); for (int i = 0; i < resources.length; i++) { InputStream inputStream = resources[i].getInputStream(); String xmlContent = IOUtils.toString(inputStream, "UTF-8"); System.out.println("content" + i + "=" + xmlContent); }
5、如果配置文件中要引用這個(gè)文件的路徑呢?
用classpath:xxx.xml 就可以了(xxx.xml放在resources目錄下)。注意是springboot的項(xiàng)目
如果還是取不到,看看你的maven工程的pom文件是否做了過濾文件,比如.keystore文件
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>*.keystore</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>*.keystore</include> </includes> </resource> </resources> </build>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Morris遍歷算法及其在二叉樹中的應(yīng)用
Morris遍歷是一種基于線索二叉樹的遍歷算法,可以在不使用?;蜻f歸的情況下,實(shí)現(xiàn)二叉樹的前序、中序和后序遍歷。該算法利用二叉樹中的空指針或線索指針,將遍歷序列嵌入到原二叉樹中,實(shí)現(xiàn)了常數(shù)級(jí)別的空間復(fù)雜度,適用于對(duì)空間要求較高的場(chǎng)景2023-04-04java.lang.IllegalStateException異常原因和解決辦法
這篇文章主要給大家介紹了關(guān)于java.lang.IllegalStateException異常原因和解決辦法,IllegalStateException是Java標(biāo)準(zhǔn)庫中的一個(gè)異常類,通常表示在不合適或無效的情況下執(zhí)行了某個(gè)方法或操作,需要的朋友可以參考下2023-07-07Java基于分治算法實(shí)現(xiàn)的棋盤覆蓋問題示例
這篇文章主要介紹了Java基于分治算法實(shí)現(xiàn)的棋盤覆蓋問題,簡(jiǎn)單描述了棋盤覆蓋問題,并結(jié)合具體實(shí)例形式分析了java基于分治算法實(shí)現(xiàn)棋盤覆蓋問題的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11在攔截器中讀取request參數(shù),解決在controller中無法二次讀取的問題
這篇文章主要介紹了在攔截器中讀取request參數(shù),解決在controller中無法二次讀取的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10解析SpringBoot整合SpringDataRedis的過程
這篇文章主要介紹了SpringBoot整合SpringDataRedis的過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06java中實(shí)現(xiàn)token過期失效超時(shí)
在Java應(yīng)用程序中,為了確保安全性和保護(hù)用戶數(shù)據(jù),一種常見的做法是使用Token進(jìn)行身份驗(yàn)證和授權(quán),Token是由服務(wù)器生成的具有一定時(shí)效的令牌,用于識(shí)別和驗(yàn)證用戶身份,當(dāng)Token失效后,用戶將無法再進(jìn)行相關(guān)操作,從而提高系統(tǒng)的安全性2023-10-10Spring?@EventListener?異步中使用condition的問題及處理
這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問題及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12