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