Springboot项目jar包中resource目录下静态资源excel、pdf等二进制文件损坏
问题描述
Springboot项目中,需要把xlsx、word等二进制文件放到resource/static目录下提供下载,但是打成jar包后,发现文件会损坏了。
原因分析:
- 这是由于文件被maven处理过了,导致的文件损坏。
- 比如yml文件中的一些变量信息,在maven编译过程中会处理成正常的字符串,最后形成完整的yml文件。
- 虽然非yml文件中没有包含变量信息,但是maven也会编译处理这些文件,二进制类型的文件就容易损坏,导致打不开。
解决方案:
项目结构
解决代码
在pom文件的resources配置中分两步打包文件。
- 先把非二进制的文件打包进去。
- 再把二进制文件打包进去。
<resources>
<resource>
<!--打包该目录下文件 -->
<directory>src/main/resources</directory>
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
<filtering>true</filtering>
<!--排除掉静态资源目录-->
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
<resource>
<!--打包static目录下-->
<directory>src/main/resources/static</directory>
<!-- 关闭过滤:解决二进制文件会被maven处理,导致文件损失 -->
<filtering>false</filtering>
<!--打包后static下的文件在jar包中的文件位置:一样的放在static下-->
<targetPath>static</targetPath>
</resource>
</resources>
完整build结构配置,仅供参考
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.1.RELEASE</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<!--打包该目录下文件 -->
<directory>src/main/resources</directory>
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
<filtering>true</filtering>
<!--排除掉静态资源目录-->
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
<resource>
<!--打包static目录下-->
<directory>src/main/resources/static</directory>
<!-- 关闭过滤:解决二进制文件会被maven处理,导致文件损失 -->
<filtering>false</filtering>
<!--打包后static下的文件在jar包中的文件位置:一样的放在static下-->
<targetPath>static</targetPath>
</resource>
</resources>
<finalName>${project.artifactId}</finalName>
</build>
其它方案(测试无效)
在pom的plugin中配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>2.6</version>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>