使用springboot打包后的文件讀取方式
springboot打包后的文件讀取
在使用了springboot打包后的項(xiàng)目中,牽扯到項(xiàng)目目錄中文件讀取工作時(shí),明明在開(kāi)發(fā)時(shí)功能正常,但是一到發(fā)布到線上環(huán)境就會(huì)報(bào)文件找不到,路徑不存在的問(wèn)題。
由于在開(kāi)發(fā)過(guò)程中,文件就在我們本地目錄中存在,因此普通正常文件的讀寫(xiě)功能不受影響,而一旦打包后,可能會(huì)由于我們自己的文件目錄放置原因一是沒(méi)有被正確打包到j(luò)ar包中,第二個(gè)即使被打包進(jìn)去,由于jar包并不會(huì)解壓到服務(wù)器中,因此如果我們按照正常的文件路徑去獲取文件的時(shí)候還是會(huì)報(bào)異常。
文件打包問(wèn)題
首先是確認(rèn)我們自己的文件有沒(méi)有被打包到j(luò)ar包中,默認(rèn)的如果文件在src/main/resources目錄下的時(shí)候是會(huì)打包的,但如果不在目錄中,我們可以通過(guò)在pom.xml中配置以下指明我們的資源文件所在。拿個(gè)mybatis的mapper.xml文件舉例,我們將沒(méi)有放到了java源碼目錄中了,則需要通過(guò)以下配置指定目錄所在
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
文件讀取問(wèn)題
記住一個(gè)準(zhǔn)則,凡是要通過(guò)路徑獲取文件的方法都會(huì)報(bào)錯(cuò),但是通過(guò)流的方式卻是可以工作的。我們拿spring提供的一個(gè)類org.springframework.core.io.ClassPathResource來(lái)解決讀取問(wèn)題。
ClassPathResource classPathResource = new ClassPathResource(path); InputStream inputStream = classPathResource.getInputStream(); // 流獲取到了就可以做自己想要的讀取操作了
但是還有一些情況,我們就是要獲取文件然后做一些操作,比如我需要通過(guò)文件構(gòu)造RandomAccessFile對(duì)象然后來(lái)實(shí)現(xiàn)某些功能,當(dāng)然我目前還沒(méi)發(fā)現(xiàn)通過(guò)流來(lái)構(gòu)造這個(gè)對(duì)象的,所以不知道還有沒(méi)有別的方法。
這種情況先獲取到流然后重新生成一個(gè)新的文件,然后我們最終讀取的是我們復(fù)制的那個(gè)文件,而不對(duì)原始文件操作,這樣這個(gè)文件就是在真實(shí)路徑中存在的。舉個(gè)簡(jiǎn)單的代碼例子,我們?cè)趕rc/main/resources下有一個(gè)test.txt文件,我們可以在要讀取文件(要保證只執(zhí)行一次)或者簡(jiǎn)單粗暴在項(xiàng)目啟動(dòng)的時(shí)候復(fù)制一下文件。
String path = "test.txt"; ClassPathResource classPathResource = new ClassPathResource(path); // 我們要將文件復(fù)制到服務(wù)器的某個(gè)目錄 String targetPath = "/app/file/test.txt"; // 通過(guò)原始文件流復(fù)制文件 Files.copy(classPathResource.getInputStream(), Paths.get(targetPath ), StandardCopyOption.REPLACE_EXISTING); // 然后通過(guò)復(fù)制的文件進(jìn)行操作 new RandomAccessFile(targetPath, "r");
Springboot打包后讀取不到文件
SpringBoot部署后文件找不到的問(wèn)題
項(xiàng)目引用了一個(gè)xml作為模板
本地訪問(wèn)文件的時(shí)候使用的方式比較直接
Document document = reader.read(ResourceUtils.getURL("classpath:").getPath() + "xmlTemplate.xml");
直接訪問(wèn)classpath下的xmlTemplate,這種方式在本地運(yùn)行的時(shí)候能取到文件,但是項(xiàng)目在打包再發(fā)布以后,問(wèn)題就出來(lái)了…
解決辦法1 失敗。。
在pom中的build中 直接配置resources
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </resource> </resources> </build>
這個(gè)配置的作用是告訴maven哪些文件需要被打進(jìn)包里。這時(shí)我看了一眼打好的jar包,確實(shí)里面是有我的文件的,但是此時(shí)代碼報(bào)錯(cuò) 找不到文件。
解決辦法 2
換一種取文件的方式,因?yàn)橐呀?jīng)確定打好的包中是有文件的新的方式
ClassPathResource resource = new ClassPathResource("xmlTemplate.xml"); Document document = reader.read(resource.getInputStream());
解決了..
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot的緩存技術(shù)的實(shí)現(xiàn)
這篇文章主要介紹了springboot的緩存技術(shù)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05java讀取excel圖片導(dǎo)入代碼示例(親測(cè)有效)
在日常工作中,我們經(jīng)常要將一些照片插入到Excel表格中,這篇文章主要給大家介紹了關(guān)于java讀取excel圖片導(dǎo)入的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10SpringBoot+Docker+IDEA實(shí)現(xiàn)一鍵構(gòu)建+推送、運(yùn)行、同鏡像多容器啟動(dòng)
這篇文章主要介紹了SpringBoot+Docker+IDEA實(shí)現(xiàn)一鍵構(gòu)建+推送、運(yùn)行、同鏡像多容器啟動(dòng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04java實(shí)現(xiàn)簡(jiǎn)單圖片上傳下載功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單圖片上傳下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10