解决Unexpected record signature: 0X9|maven 资源过滤
记录问题:我们有个需求是根据
excel
模版导出一个excel
表。我们的项目是SpringBoot,所以理所当然的把这个模版文件放到了,resources
文件夹中。但是在导出文件的时候却遇到了invalid code lengths set
及Unexpected record signature: 0X9
的错误。
如何解决?
先说如何解决吧。两种方案任意一种即可解决该问题。
- 方法一
在
pom.xml
的<build>
中添加这一部分。
<build><resources><!--这段配置的作用是将 src/main/resources 目录下的所有文件复制到构建目录中,但排除了 .xlsx、.xls、.zip 和 .pdf 文件,并在复制过程中启用了资源过滤。--><resource><directory>src/main/resources</directory><!-- 表示将包含哪些文件 **/* 表示所有子目录及所有文件 --><includes><include>**/*</include></includes><!-- 表示将排除哪些文件 --><excludes><exclude>**/*.xlsx</exclude><exclude>**/*.xls</exclude><exclude>**/*.zip</exclude><exclude>**/*.pdf</exclude></excludes><!-- 开启资源过滤 --><filtering>true</filtering></resource><!--这段配置的作用是将 src/main/resources 目录下的 .xlsx、.xls、.zip 和 .pdf 文件,复制到构建目录中并在复制过程中关闭资源过滤。--><resource><directory>src/main/resources</directory><includes><include>**/*.xlsx</include><include>**/*.xls</include><include>**/*.zip</include><include>**/*.pdf</include></includes><!-- 关闭资源过滤 --><filtering>false</filtering></resource></resources>
</build>
- 方式二
使用
maven-resources-plugin
插件来帮我们在进行资源过滤
时,不要对指定扩展名的文件进行过滤。
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.1.0</version><configuration><!--排除的不需要资源过滤的文件后缀名列表--><nonFilteredFileExtensions><nonFilteredFileExtension>xlsx</nonFilteredFileExtension><nonFilteredFileExtension>xls</nonFilteredFileExtension><nonFilteredFileExtension>zip</nonFilteredFileExtension><nonFilteredFileExtension>pdf</nonFilteredFileExtension></nonFilteredFileExtensions></configuration>
</plugin>
资源过滤
资源过滤,他是要干什么?
占位符替换
。maven
在对构建项目的时候如何遇到文件中有${env}
这种格式的内容的时候,他就会在环境变量中或者项目变量中去寻找对应的值来进行替换。举例:像
db
这种配置通常为了安全,我们并不会直接将明文直接写在配置文件中,通常我们都是通过环境变量的方式来进行替换(虽然实际使用上并不是在打包环节进行替换,但是使用这种方式也可以达到目的)。
结论
为什么会出现文件损坏等这种问题呢?
当
maven
,项目在构建并且我们开启了资源过滤的时候,maven
会去扫描所有资源文件中的内容,并且遇到占位符后会对其进行替换(这里其实还会对文件进行压缩等安全性的操作)。所以可能会对我们的一些资源文件造成损坏的问题,从而导致报错。通过在
pom.xml
中对资源文件进行一部分的排除过滤后,使得原文件可以跳过资源过滤从而保证文件的完整性。
补充
遇到一个奇怪的问题🤔。
我在Idea里面直接启动我的
SpringBoot
的时候,想使用这个资源过滤
来对一个文件进行占位符替换的时候,发现他不生效。
我在pom.xml
中添加了一个self.admin
的变量,想要通过这个变量来对文件中的一个占位符来进行替换。
pom.xml
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><resource.delimiter>${}</resource.delimiter><self.admin>111</self.admin>
</properties>
原文件
${self.admin}${pom.name}
直接启动SpringBoot
项目后生成的target
目录,发现并没有替换成功。
但是我使用mvn package
进行打包的时候,却发现可以正常替换成功。
这是为什么呢?我感觉这里其实也走了一部分
maven
的编译。因为我们在修改pom.xml
的一些plugin
配置的时候,他也会生效。这里我是个🤔。有解决方案,那就是
强制让idea使用maven在对项目进行编译与运行
。在setting
中找到该选项Delegate build and run actions to Maven
并勾选他。
再次运行SpringBoot
项目,发现他成功替换了。
思考?🤔
为什么
idea
识别到是maven
项目后不强制使用maven
来构建项目呢?我的想法
- 通常我们有一些插件并不需要在编译是使用,像有一些
jib-maven-plugin
构建docker
镜像。- 使用maevn编译可以会慢一些。
所有
idea
并没有默认勾选这个设置。