工作1年半胖40斤,厦门网站搜索优化,徐州建设集团有限公司,贵州城乡建设官方网站解决Unexpected record signature: 0X9|maven 资源过滤 记录问题#xff1a;我们有个需求是根据excel模版导出一个excel表。我们的项目是SpringBoot#xff0c;所以理所当然的把这个模版文件放到了#xff0c;resources文件夹中。但是在导出文件的时候却遇到了invalid code …解决Unexpected record signature: 0X9|maven 资源过滤 记录问题我们有个需求是根据excel模版导出一个excel表。我们的项目是SpringBoot所以理所当然的把这个模版文件放到了resources文件夹中。但是在导出文件的时候却遇到了invalid code lengths set及Unexpected record signature: 0X9的错误。 如何解决? 先说如何解决吧。两种方案任意一种即可解决该问题。 方法一 在pom.xml的build中添加这一部分。 buildresources!--这段配置的作用是将 src/main/resources 目录下的所有文件复制到构建目录中但排除了 .xlsx、.xls、.zip 和 .pdf 文件并在复制过程中启用了资源过滤。--resourcedirectorysrc/main/resources/directory!-- 表示将包含哪些文件 **/* 表示所有子目录及所有文件 --includesinclude**/*/include/includes!-- 表示将排除哪些文件 --excludesexclude**/*.xlsx/excludeexclude**/*.xls/excludeexclude**/*.zip/excludeexclude**/*.pdf/exclude/excludes!-- 开启资源过滤 --filteringtrue/filtering/resource!--这段配置的作用是将 src/main/resources 目录下的 .xlsx、.xls、.zip 和 .pdf 文件复制到构建目录中并在复制过程中关闭资源过滤。--resourcedirectorysrc/main/resources/directoryincludesinclude**/*.xlsx/includeinclude**/*.xls/includeinclude**/*.zip/includeinclude**/*.pdf/include/includes!-- 关闭资源过滤 --filteringfalse/filtering/resource/resources
/build方式二 使用maven-resources-plugin插件来帮我们在进行资源过滤时不要对指定扩展名的文件进行过滤。 plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-resources-plugin/artifactIdversion3.1.0/versionconfiguration!--排除的不需要资源过滤的文件后缀名列表--nonFilteredFileExtensionsnonFilteredFileExtensionxlsx/nonFilteredFileExtensionnonFilteredFileExtensionxls/nonFilteredFileExtensionnonFilteredFileExtensionzip/nonFilteredFileExtensionnonFilteredFileExtensionpdf/nonFilteredFileExtension/nonFilteredFileExtensions/configuration
/plugin资源过滤 资源过滤他是要干什么 占位符替换。maven在对构建项目的时候如何遇到文件中有${env}这种格式的内容的时候他就会在环境变量中或者项目变量中去寻找对应的值来进行替换。 举例像db这种配置通常为了安全我们并不会直接将明文直接写在配置文件中通常我们都是通过环境变量的方式来进行替换虽然实际使用上并不是在打包环节进行替换但是使用这种方式也可以达到目的。 结论 为什么会出现文件损坏等这种问题呢 当maven项目在构建并且我们开启了资源过滤的时候maven会去扫描所有资源文件中的内容并且遇到占位符后会对其进行替换(这里其实还会对文件进行压缩等安全性的操作)。所以可能会对我们的一些资源文件造成损坏的问题从而导致报错。 通过在pom.xml中对资源文件进行一部分的排除过滤后使得原文件可以跳过资源过滤从而保证文件的完整性。 补充 遇到一个奇怪的问题。 我在Idea里面直接启动我的SpringBoot的时候想使用这个资源过滤来对一个文件进行占位符替换的时候发现他不生效。 我在pom.xml中添加了一个self.admin的变量想要通过这个变量来对文件中的一个占位符来进行替换。
pom.xml propertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingjava.version1.8/java.versionresource.delimiter${}/resource.delimiterself.admin111/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并没有默认勾选这个设置。