解讀classpath讀取resources目錄下的文件
classpath讀取resources目錄下文件
最近在springboot+maven的項目中去讀取資源文件的時候,報了找不到文件的錯誤。
由此展開了對maven項目編譯前和編譯后的目錄結(jié)構(gòu)的了解,以及對java的classpath的理解。
首先:
由Maven構(gòu)建的web工程,java代碼放在src/main/java路徑下,資源(配置文件等)放在src/main/resources路徑下,當(dāng)構(gòu)建jar包 或 war包時,JVM虛擬機會自動編譯java文件為class文件存放在 target/classes目錄下,resource資源下的文件會原封不動的拷貝一份到 target/classes 目錄下:而我們一般取的classpath就是target/classes目錄
你可以通過這種方式打印你的calsspath
A.class.getClassLoader().getResource("").getPath();
這里又引出一個話題,我們可以根據(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("")不帶"/“時候是從當(dāng)前類所在包路徑去獲取資源
- 2、getResource("/")帶”/"時候是從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()
不帶"/"時候是從當(dāng)前類所在包路徑去獲取資源class.getResource()
帶"/"時候是從classpath的根路徑獲取class.getResource()
本質(zhì)上也是調(diào)用了getClassLoader,只是封裝了一層方便了我們使用而已getClassLoader().getResource("")
不帶"/"時候是從classpath的根路徑獲取getClassLoader().getResource("/")
路徑中無法帶有"/"getResourceAsStream()
方法僅僅是獲取對應(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、如果配置文件中要引用這個文件的路徑呢?
用classpath:xxx.xml 就可以了(xxx.xml放在resources目錄下)。注意是springboot的項目
如果還是取不到,看看你的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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Morris遍歷算法及其在二叉樹中的應(yīng)用
Morris遍歷是一種基于線索二叉樹的遍歷算法,可以在不使用棧或遞歸的情況下,實現(xiàn)二叉樹的前序、中序和后序遍歷。該算法利用二叉樹中的空指針或線索指針,將遍歷序列嵌入到原二叉樹中,實現(xiàn)了常數(shù)級別的空間復(fù)雜度,適用于對空間要求較高的場景2023-04-04java.lang.IllegalStateException異常原因和解決辦法
這篇文章主要給大家介紹了關(guān)于java.lang.IllegalStateException異常原因和解決辦法,IllegalStateException是Java標(biāo)準(zhǔn)庫中的一個異常類,通常表示在不合適或無效的情況下執(zhí)行了某個方法或操作,需要的朋友可以參考下2023-07-07在攔截器中讀取request參數(shù),解決在controller中無法二次讀取的問題
這篇文章主要介紹了在攔截器中讀取request參數(shù),解決在controller中無法二次讀取的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10解析SpringBoot整合SpringDataRedis的過程
這篇文章主要介紹了SpringBoot整合SpringDataRedis的過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Spring?@EventListener?異步中使用condition的問題及處理
這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問題及處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12