解决Unexpected record signature 0X9&&maven 资源过滤

解决Unexpected record signature: 0X9|maven 资源过滤

记录问题:我们有个需求是根据excel模版导出一个excel表。我们的项目是SpringBoot,所以理所当然的把这个模版文件放到了,resources文件夹中。但是在导出文件的时候却遇到了invalid code lengths setUnexpected record signature: 0X9的错误。

如何解决?

先说如何解决吧。两种方案任意一种即可解决该问题。

  • 方法一

pom.xml<build>中添加这一部分。

xml 复制代码
<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插件来帮我们在进行资源过滤时,不要对指定扩展名的文件进行过滤。

xml 复制代码
<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

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>

原文件

txt 复制代码
${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并没有默认勾选这个设置。

相关推荐
用户7493636848432 分钟前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java
SimonKing21 分钟前
一键开启!Spring Boot 的这些「魔法开关」@Enable*,你用对了吗?
java·后端·程序员
间彧1 小时前
Spring Boot集成Spring Security 6.x完整指南
java
xiezhr2 小时前
用户只需要知道「怎么办」,不需要知道「为什么炸了」
java·api·接口设计规范
xiezhr2 小时前
接口设计18条军规:写给那些半夜被“502”叫醒的人
java·api·restful
RainbowSea11 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea11 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程
考虑考虑15 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613515 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊16 小时前
Java学习第22天 - 云原生与容器化
java