我們項目使用report 報表功能,然后在加載xxxx.jasper文件時候報的invalid stream header: EFBFBDEF 的錯誤
public JasperPrint fill(InputStream inputStream, Map<String, Object> parameters)throws JRException{
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream); //這里出錯
return fill(jasperReport, parameters);
}
跟蹤源碼主要是下面出錯,百思不得其解,網上說很多都是發現字符被改變了以至於ObjectOutputStream無法識別該字符數組所以拋出了java.io.StreamCorruptedException: invalid stream header: EFBFBDEF,可是我這個跟字符串沒關系。inputStream讀取的是二進制文件,怎么可能出現這個問題。
ObjectInputStream in = new ObjectInputStream(inputStream);
偶然看到這篇文章才得以解決https://stackoverflow.com/questions/24078820/java-io-streamcorruptedexception-invalid-stream-header-efbfbdef
主要是跟maven resource 標簽有關系,maven 打包時候,已經把二進制文件給破壞了,導致失敗
<resources>
<resource>
<targetPath>${project.build.directory}/classes</targetPath> <directory>src/main/resources</directory> <filtering>true</filtering> </resource>
</resources>
在maven 網站過濾的時候
警告:不要過濾包含圖像等二進制內容的文件!這很可能會導致輸出損壞。如果您同時擁有文本文件和二進制文件作為資源,則需要聲明兩個互斥的資源集。第一個資源集定義要過濾的文件,另一個資源集定義要保持不變的文件。
以下則沒有問題
<resources> <resource> <targetPath>${project.build.directory}/classes</targetPath> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>**/*.jasper</exclude> <exclude>**/*.jrxml</exclude> </excludes> </resource> <resource> <targetPath>${project.build.directory}/classes</targetPath> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>**/*.jasper</include> <include>**/*.jrxml</include> </includes> </resource>
</resources>