Maven filter 导致打包以后的excel文件损坏的问题

在项目中,使用Maven Filter进行配置文件替换时,意外导致部署后的Excel模板损坏。问题源于filter处理了包含Excel模板的src/main/resources目录。通过尝试排除模板目录、调整模板位置以及修改读取路径,最终解决了war包中Excel文件损坏的问题。

问题描述:

        系统内原本有个功能,是导出excel的报表。

这个功能原本是好的。后来变更过一些配置以后,发现这个功能出问题了

我们系统的excel导出基于预设的模板的,预设的模板的位置如下图:

就是说,模板的格式预先设置好了,然后读取模板的流,写入数据,再输出

现在这个功能出问题了,经过排查,发现是部署到web容器以后,这两个excel模板已经损坏了

对比分支,发现之前的部署并不会导致excel模板损坏

经过再次的排查,发现是因为使用了maven的filter引起的:


使用maven的filter的目的是为了每次部署的时候根据maven命令的不同选择不同的配置文件,重写db.properties。而不需要每次都去修改数据库连接等配置

从filter的配置中可以看到,目标dir是src/main/resources目录,这个目录下就包含了两个excel文件。

不清楚是何原因,这样过滤一遍之后,打出来的war包,excel文件就损坏了。


好了,既然问题已经定位,为了最大程度的减少修改量,我的第一个设想是resource下面是否有exclude标记?一看确实有:

如果此时是用eclipse的export的方式导出war包,OK,这个问题是解决了的。

但如果改用maven的package命令打包,我却发现打出来的war包,template目录没了。。

没了。。。对,没了。。。


无奈之下,只好,把template目录转移到webapp目录下,并且修改相应的读取路径。

这样一来,filter不会扫描到两个excel模板,打出来的war包,excel自然也就是好的了。


关于excludes标记的那种方式,或许是我使用的方式不对,或许是真的不可以。如果有更好的方式,请一定告诉我。




### 原因分析 Maven打包项目时会自动对资源文件进行统一编码处理,这种机制适用于文本文件,如 `.properties`、`.yml` 等,但对于二进制文件(如 Excel 文件 `.xlsx`、`.xls`、证书 `.cer`、`.pfx` 等)则可能导致文件损坏Maven 会尝试对这些二进制文件进行字符编码转换,导致文件内容被错误修改,从而无法正常打开或使用 [^1]。 此外,Maven 的资源过滤(filtering)功能默认会对资源目录中的文件进行处理,替换中的变量(如 `${property}`)。虽然这种机制在配置文件中非常有用,但对非文本文件(如 Excel)而言,会破坏其二进制结构,导致文件损坏 [^2]。 ### 解决方案 为了解决 Maven 打包Excel 文件损坏问题,可以通过配置 `maven-resources-plugin` 插件,将 `.xlsx`、`.xls` 等二进制文件排除在资源过滤和编码转换之外。具体配置如下: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.2.1</version> <configuration> <encoding>UTF-8</encoding> <nonFilteredFileExtensions> <nonFilteredFileExtension>xlsx</nonFilteredFileExtension> <nonFilteredFileExtension>xls</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> </plugins> </build> ``` 同时,也可以在 `<resources>` 配置中禁用资源过滤功能,以确保所有资源文件不会被意外修改: ```xml <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> </resource> </resources> ``` 通过上述配置,Maven打包过程中将不会对 `.xlsx` 和 `.xls` 文件进行任何编码转换或变量替换,从而保证文件的完整性 [^4]。 ### 验证与注意事项 完成配置后,可以通过以下方式验证 Excel 文件是否完好: 1. 使用归档工具(如 7-Zip 或 WinRAR)打开生成的 JAR ,查看其中的 Excel 文件是否可以正常提取。 2. 在程序运行时加载资源文件,并尝试读取其内容,确保文件未被损坏 [^3]。 此外,应确保 IntelliJ IDEA 的全局编码设置为 UTF-8,以避免开发过程中因编码不一致而导致的潜在问题 [^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值