使用的是spring-boot项目,天然而然的使用spring-boot-maven-plugin插件对项目进行打包操做,因为项目中docx文档做为模板文档,以前一直运行出错,去看了下target下面的这个文档(有的时候FileNotFoundException或者出现各类文件错误,去看target仍是比较真实的),而后打开一看,全乱码了,如图: css
实验了各类网上的方案,我搜索到的基本都是说maven或者spring-boot-maven-plugin致使excel文档出现问题的。
1. 修改编码为UTF-8
<plugin>
<!--打包成可执行jar-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
2. 使用另一种打包方案
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>本身的主类(含有main方法的类)的全类名</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
3. 查看本身项目是否设置为UTF-8,以及对应全部的文件是否设置为UTF-8
看了,全是UTF-8
复制代码
以上方法所有试验愣是没解决。html
最后拿着一个项目做比对,发现了一个小区别:
正常的项目(maven项目,不是spring-boot类型的项目,打包使用的是maven-compiler-plugin这个插件)的resource配置有个区别:
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.json</include>
<include>**/*.yml</include>
<include>**/*.js</include>
<include>**/*.html</include>
<include>**/*.csv</include>
<include>**/*.sqlite</include>
<include>**/*.docx</include>
<include>**/*.zip</include>
</includes>
</resource>
非正常项目的resource(这个是maven的spring-boot项目,使用:spring-boot-maven-plugin这个插件)为:
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.json</include>
<include>**/*.yml</include>
<include>**/*.js</include>
<include>**/*.html</include>
<include>**/*.css</include>
<include>**/*.svg</include>
<include>**/*.jpg</include>
<include>**/*.jpeg</include>
<include>**/*.png</include>
<include>**/*.ico</include>
<include>**/*.woff2</include>
<include>**/*.txt</include>
<include>**/*.xlsx</include>
<include>**/*.xls</include>
<include>**/*.docx</include>
</includes>
<excludes>
<exclude>env/*.properties</exclude>
</excludes>
</resource>
他俩的区别就是,不正常的这个resource配置多了个:<filtering>true</filtering>这个选项
复制代码
结果去除掉true以后,正常了。去除以后的resource为:java
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.json</include>
<include>**/*.yml</include>
<include>**/*.js</include>
<include>**/*.html</include>
<include>**/*.css</include>
<include>**/*.svg</include>
<include>**/*.jpg</include>
<include>**/*.jpeg</include>
<include>**/*.png</include>
<include>**/*.ico</include>
<include>**/*.woff2</include>
<include>**/*.txt</include>
<include>**/*.xlsx</include>
<include>**/*.xls</include>
<include>**/*.docx</include>
</includes>
<excludes>
<exclude>env/*.properties</exclude>
</excludes>
</resource>
复制代码
我也不知道什么缘由。搜索了一下大体解释以下:
resource的filtering配置:
主要用来替换项目中的资源文件(*.xml、*.properties)当中的${...},好比${db.url},
那么若是配置了db.url=aaa的话,在项目编译的时候,就会自动的把${db.url}替换为aaa
也就是说,多是在打包的时候,docx里面有好多${xxxxx}形式的东西,而后致使出现替换的问题,可是我查看了下文档,
好像也不是那么一回事,具体缘由不明白,上面这个缘由只是一个猜想。
复制代码
若是去除掉了true 或者设置为false ,那么随之而来的一个问题就是:你的maven打包多环境替换properteies将会失效。 想起来一句话:此事古难全,希望人长久!spring
今天实验了下,有个解决方案,原来是如此的简单,我居然没有想到:解决方案就是,多写几个resource标签就行,全部的二进制形式的文件,或者乱码的文件都放置在不须要替换的resource标签下面 例如:sql
<resources>
//这个是java的文件操做,不须要过滤
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
//这个是真正的资源文件,须要过滤的
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.json</include>
<include>**/*.yml</include>
<include>**/*.js</include>
<include>**/*.html</include>
<include>**/*.css</include>
<include>**/*.svg</include>
<include>**/*.jpg</include>
<include>**/*.jpeg</include>
<include>**/*.png</include>
<include>**/*.ico</include>
<include>**/*.woff2</include>
<include>**/*.txt</include>
<include>**/*.xlsx</include>
<include>**/*.xls</include>
</includes>
<excludes>
<exclude>env/*.properties</exclude>
</excludes>
</resource>
//这个也是资源文件,不须要过滤的,能够单独拉出来设置filtering为false
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.docx</include>
</includes>
</resource>
</resources>
复制代码