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

2021-08-31 14:54:43 浏览数 (1)

一、问题描述

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

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

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

代码语言:javascript复制
        some
        
            
                
                    maven-war-plugin
                    3.2.2
                    
                        
                        true
                        
                        
                            
                                src/main/resources
                                WEB-INF/classes
                                true
                            
                        
                    
    
            
        
        
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                    **/*.conf

                
                false
            

            
                src/main/resources
                
                    **/*.properties
                    **/*.xml
                    **/*.conf
                
                false

二、解决尝试

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后你的二进制文件被损毁,你可配置不被过滤的文件拓展名列表

代码语言:javascript复制
 ...
        
          
          
          
            properties/config.prop
          
          
            
            pdf
          
          
            
              resource2
              
              false
            
            
              configurations
              
              true
              
                **/properties
              
            
          
        
        ...

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

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

代码语言:javascript复制
      pdf

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

另外该文档还讲到:

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、不太可能的问题是学习的一个好机会

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

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

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

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

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

四、其他

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

0 人点赞