专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Spring-boot-maven-plugin插件打包项目,docx文档出现乱码

问题

使用的是spring-boot项目,自然而然的使用spring-boot-maven-plugin插件对项目进行打包操作,由于项目中docx文档作为模板文档,之前一直运行出错,去看了下target下面的这个文档(有的时候FileNotFoundException或者出现各种文件错误,去看target还是比较真实的),然后打开一看,全乱码了,如图:

132_1.png正常的应该为: 132_2.png

解决过程

实验了各种网上的方案,我搜索到的基本都是说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

以上方法全部试验愣是没解决。

最后拿着一个项目作比对,发现了一个小区别:
正常的项目(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为:

            <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将会失效。 想起来一句话:此事古难全,但愿人长久!

补充

今天实验了下,有个解决方案,原来是如此的简单,我竟然没有想到:解决方案就是,多写几个resource标签就行,所有的二进制形式的文件,或者乱码的文件都放置在不需要替换的resource标签下面 例如:

<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>

文章永久链接:https://tech.souyunku.com/44575

未经允许不得转载:搜云库技术团队 » Spring-boot-maven-plugin插件打包项目,docx文档出现乱码

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们