問題描述
我準(zhǔn)備離開金融公司,就在前一天,正好一個(gè)程序員妹子請(qǐng)我解決一個(gè)問題。
問題是這樣的,項(xiàng)目是spring boot 的項(xiàng)目,在她在本地編輯器運(yùn)行良好,但是發(fā)布到Linux上后提示文件損壞,下載后發(fā)現(xiàn)文件大小為0。
解決方案
1、maven 打包的時(shí)候,使用了filter,其原理是處理文本文件,并將其替換變量,對(duì)于二進(jìn)制文件有問題。故而修改如下:
<resources>
<resource>
<directory>
src/main/resources
</directory>
<filtering>true</filtering>
<excludes><exclude>templates/temp/*</exclude></excludes>
</resource>
<resource><directory>src/main/resources</directory><filtering>false</filtering>
<includes><include></include>templates/temp/*</includes></resource>
</resources>
2、調(diào)用方法為ResourceUtils.getFile();修改為getClass().getResourceAsStream();
問題剖析及解決思路
開始的時(shí)候看了一下jar包,里面打包的excel文件是有問題的,無法打開,后來斷定是excel通過maven打包的問題(filter的處理問題),filter。
解決思路,maven的filter,主要作用就是替換變量,所以會(huì)把資源文件作為文本文件轉(zhuǎn)碼處理,并替換字符串。單對(duì)于像excel等這些二進(jìn)制文件,則會(huì)出現(xiàn)問題。故有了上面的解決方案,當(dāng)然這其中也是經(jīng)歷了很多波折才找到的方案。
然后發(fā)現(xiàn)問題依舊在,后來看一下日志,發(fā)現(xiàn)問題變更為jar:file:/.....終于明白問題的根源了,回想了一下java虛擬機(jī)的原理。再次解釋一下:
java io中讀取文件,一種是根據(jù)路徑找到文件File的,一種是流的形式。?
在本地可以是因?yàn)楸镜鼐庉嬈鲌?zhí)行的時(shí)候,是執(zhí)行的本地編譯的文件,查找的還是某個(gè)文件夾中的文件
在jar包中不行是因?yàn)?,jar的執(zhí)行時(shí)就是一個(gè)文件不會(huì)解壓,只能是在虛擬機(jī)中找到對(duì)應(yīng)的stream,然后操作文件。
就像war包為什么可以一樣,是因?yàn)閼?yīng)用服務(wù)器對(duì)其解壓執(zhí)行,所以依舊可以找到文件。
解釋的比較大白話,僅僅是給自己留個(gè)印象
總結(jié)
很多問題找不到解決辦法的時(shí)候,不妨想想計(jì)算機(jī)原理、虛擬機(jī)原理、實(shí)現(xiàn)原理等等,你會(huì)有意想不到的收獲