前言
上个月做了一个根据协议模板签署协议的功能,事先把协议模板(pdf文件)放在当前项目的resource目录下,打成jar运行后,在签署协议时,从classpath下读取模板内容然后填充pdf内对应的字段再将签署后的协议上传即可。
在测试时发现虽然能够根据模板生成协议文件并上传,但是把上传后的文件下载到本地打开时提示格式损坏,一开始认为是读取jar内的模板文件获取的输入流有问题(实际上是模板文件有问题),在本地吭呲吭呲一顿debug测试始终没有排查到具体的问题,后来突发奇想看一下打包之后target目录下的模板文件,目录下虽然有模板文件,但是一打开就提示格式损坏,这个时候就意识到了应该是maven打包的时候导致模板文件出了问题。
然后又开始了面向百度修复bug,一顿百度之后发现了问题,在pom文件中加入以下配置即可
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<!--过滤掉pdf文件,不对其进行重新编码-->
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
maven-resources-plugin是什么
先贴上官方文档的地址 maven-resources-plugin
通俗来说,maven-resources-plugin
是一个maven打包时进行资源文件复制的插件,使用project.build.resources元素来指定需要复制哪些资源文件。
下面介绍这个插件的一些常用参数
必须参数
-
outputDirectory
复制资源文件时的输出目录,官网上介绍这个参数是必须参数,但是实际上不设置也行,默认是
放在${project.build.outputDirectory}
目录下
可选参数
addDefaultExcludes
在资源文件复制时是否排除(不复制)的默认文件,默认值是true,开启后会排除以下后缀的文件
Misc: */~, */##, */.#, */%%, */._
CVS: **/CVS, /CVS/, **/.cvsignore
RCS: **/RCS, /RCS/
SCCS: **/SCCS, /SCCS/
VSSercer: **/vssver.scc
MKS: **/project.pj
SVN: **/.svn, /.svn/
GNU: **/.arch-ids, /.arch-ids/
Bazaar: **/.bzr, /.bzr/
SurroundSCM: **/.MySCMServerInfo
Mac: **/.DS_Store
Serena Dimension: **/.metadata, /.metadata/
Mercurial: **/.hg, /.hg/
GIT: **/.git, **/.gitignore, **/.gitattributes, /.git/
Bitkeeper: **/BitKeeper, /BitKeeper/, **/ChangeSet, /ChangeSet/
Darcs: **/_darcs, /_darcs/, **/.darcsrepo, */.darcsrepo/****/-darcs-backup, **/.darcs-temp-mail
如果有特殊的原因不需要排除上述默认文件,可以将该值设置成false
.encoding
读写需要被复制的资源文件时使用的字符集,默认是${project.build.sourceEncoding}
,打包时会使用该字符集将需要复制的资源文件重新编译。propertiesEncoding
读写属性配置文件时使用的字符集,如果未指定,则使用encoding
指定的字符集。nonFilteredFileExtensions
资源文件复制时不需要重新编译的文件拓展名。
再回到我最开始的问题,在打包后进行资源文件复制时,重新将协议模板文件重新编译了一次,所以导致了协议默认文件格式损坏,因此,只要设置了nonFilteredFileExtension
将pdf文件排除即可,在复制时不对其进行重新编译。
以上只是介绍了几个比较常用的属性,其他属性请参考官方文档的说明。
总结
虽然使用了很久的maven,但是更多是把它当作一个黑箱子使用,对其机制原理没有深入了解,官方文档也没怎么看过。说到底还是太菜,以后要省点刷视频的时间,多看看官方文档。