maven-war-plugin二进制文件损坏问题

一、问题描述

最近一个朋友在windows上遇到一个非常诡异的现象,maven项目的资源包下有一个字体文件夹,里面存放了一个字体。

打包后字体损坏,文件大小也增加了很多。

pom.xml的build标签配置大致如下:

<build>
        <finalName>some</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                    <configuration>
                        <!-- 将类文件打成jar包 -->
                        <archiveClasses>true</archiveClasses>
                        <!-- 将资源文件打到classes目录下 -->
                        <webResources>
                            <resource>
                                <directory>src/main/resources</directory>
                                <targetPath>WEB-INF/classes</targetPath>
                                <filtering>true</filtering>
                            </resource>
                        </webResources>
                    </configuration>
    
            </plugins>
        </pluginManagement>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                    <include>**/*.conf</include>

                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                    <include>**/*.conf</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

二、解决尝试

2.1 对比文件信息

通过新旧字体文件的对比发现,打包后的字体文件更大且被损毁。

猜测可能是maven插件问题。

2.2 换环境法

在mac 上一个新的项目,拷贝 build 配置,复制资源目录。
运行maven插件的,clear和compile后发现,target 下 classes文件夹下字体文件正常,打jar包后解压也正常,这就很诡异了。

让朋友用maven插件,先clear 后 compile这个maven项目,发现 classes文件夹下没有字体文件。

观察build配置,发现没包含字体类型,因此修改resource 的 includes 标签,添加包含 ttf文件格式。

结果classes文件夹下的字体正常,而项目目录下的字体仍然不正常。

这就尴尬了,两个目录一个正常一个不正常, windows下和mac下编译效果不同。

2.3 官方文档大法

https://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html

To prevent corrupting your binary files when filtering is enabled, you can configure a list of file extensions that will not be filtered.

翻译:为了避免开启 filter后你的二进制文件被损毁,你可配置不被过滤的文件拓展名列表

 ...
        <configuration>
          <!-- the default value is the filter list under build -->
          <!-- specifying a filter will override the filter list under build -->
          <filters>
            <filter>properties/config.prop</filter>
          </filters>
          <nonFilteredFileExtensions>
            <!-- default value contains jpg,jpeg,gif,bmp,png -->
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
          </nonFilteredFileExtensions>
          <webResources>
            <resource>
              <directory>resource2</directory>
              <!-- it's not a good idea to filter binary files -->
              <filtering>false</filtering>
            </resource>
            <resource>
              <directory>configurations</directory>
              <!-- enable filtering -->
              <filtering>true</filtering>
              <excludes>
                <exclude>**/properties</exclude>
              </excludes>
            </resource>
          </webResources>
        </configuration>
        ...

从注释我们还可以发现,默认 jpg,jpeg,gif,bmp,png这几种图片类型是包含的。

 

该描述和本诡异问题表现非常相符,因此加上这一段:

<nonFilteredFileExtensions>
      <!-- default value contains jpg,jpeg,gif,bmp,png -->
      <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
</nonFilteredFileExtensions>

重新编译打包项目,发现字体正常,问题解决。

另外该文档还讲到:

Note: In versions 2.2 and earlier of this plugin the platform encoding was used when filtering resources. Depending on what that encoding was you could end up with scrambled characters after filtering. Starting with version 2.3 this plugin respects the property project.build.sourceEncoding when filtering resources. One notable exception to this is that .xml files are filtered using the encoding specified inside the xml-file itself.

2.2和之前的版本过滤资源时使用平台的默认编码。从这里可以猜测过滤资源时会使用到字符编码。

关于这里的过滤的具体含义,感兴趣可以从官方文档中深入学习,也可拉取源码进行研究,这里浅尝辄止不作展开。

 

 

三、总结

1、发现众多问题都是由于官方文档不熟导致的。

大家第一次用某技术的时候,尽量能够多读读官方文档。

官方文档解决不了的多看源码,多调试源码,多分析。

大家可以想想自己spring用了多久?官方文档看过几遍?

2、不要猜测问题,而是要定位问题。

先根据表现猜测最可能的情况,然后针对性进行解决。

3、不太可能的问题是学习的一个好机会

初学时很害怕遇到诡异的问题,因为一个问题可能卡住很久,非常浪费时间。

现在发现每个诡异的问题几乎都预示着你掌握的还不够扎实,以为这一次好的学习机会,也是考验你排错能力的一个机会。

 

也有很多朋友会遇到类似的小错误,但是很多人不重视总结,不重视分析,后面遇到类似的问题依然不知所措。

但是解决问题的能力是进阶必备的,希望大家可以掌握更全面的技巧,更快速的定位问题。

多参考一下别人解决问题的思路,多看一些案例,多尝试一下不同的解决问题的方法,用过做一些新的尝试。

四、其他

关于排错可以参考为的另外一篇文章《代码排错和避免错误的正确姿势》

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明明如月学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值