美文网首页
Spring boot 项目中包含excel 放到linux中提

Spring boot 项目中包含excel 放到linux中提

作者: 倪宝华 | 来源:发表于2017-10-20 11:32 被阅读0次

    问题描述


    我准备离开金融公司,就在前一天,正好一个程序员妹子请我解决一个问题。

    问题是这样的,项目是spring boot 的项目,在她在本地编辑器运行良好,但是发布到Linux上后提示文件损坏,下载后发现文件大小为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、调用方法为ResourceUtils.getFile();修改为getClass().getResourceAsStream();

    问题剖析及解决思路


    开始的时候看了一下jar包,里面打包的excel文件是有问题的,无法打开,后来断定是excel通过maven打包的问题(filter的处理问题),filter。

    解决思路,maven的filter,主要作用就是替换变量,所以会把资源文件作为文本文件转码处理,并替换字符串。单对于像excel等这些二进制文件,则会出现问题。故有了上面的解决方案,当然这其中也是经历了很多波折才找到的方案。

    然后发现问题依旧在,后来看一下日志,发现问题变更为jar:file:/.....终于明白问题的根源了,回想了一下java虚拟机的原理。再次解释一下:

    java io中读取文件,一种是根据路径找到文件File的,一种是流的形式。 

    在本地可以是因为本地编辑器执行的时候,是执行的本地编译的文件,查找的还是某个文件夹中的文件

    在jar包中不行是因为,jar的执行时就是一个文件不会解压,只能是在虚拟机中找到对应的stream,然后操作文件。

    就像war包为什么可以一样,是因为应用服务器对其解压执行,所以依旧可以找到文件。

    解释的比较大白话,仅仅是给自己留个印象

    总结


    很多问题找不到解决办法的时候,不妨想想计算机原理、虚拟机原理、实现原理等等,你会有意想不到的收获

    相关文章

      网友评论

          本文标题:Spring boot 项目中包含excel 放到linux中提

          本文链接:https://www.haomeiwen.com/subject/msvmuxtx.html