Maven — maven filtering OTS parsing error incorrect file size in WOFF head 产生原因及两种解决方案

本文介绍了在SpringBoot项目中,前端静态资源因配置问题导致的图标和文字显示异常。问题源于Maven资源配置的filtering模式误替换WOFF文件内容,引发浏览器解析错误。解决方案包括:一是通过excludes/excludes配置避免静态资源目录下的WOFF文件被过滤;二是使用nonFilteredFileExtensions指定不进行过滤的文件后缀,如WOFF。这两个方案能有效防止静态资源文件被错误处理,确保前端页面正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景说明

前端静态资源文件放在后端SpringBoot项目resources文件夹下,多环境打包后前端页面出现了图标及文字未按预期样式显示的情况,查看浏览器控制台发现出现如下错误。

OTS parsing error: incorrect file size in WOFF header

原因定位

先来看看配置的Maven pom内容。

<build>
        <finalName>project-name</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <!-- 配置 @ 占位符 -->
                <configuration>
                    <encoding>utf-8</encoding>
                    <delimiters>
                        <delimiter>@</delimiter>
                    </delimiters>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 开启过滤,用指定的参数替换directory下的文件中的参数 -->
                <filtering>true</filtering>
            </resource>
        </resources>
</build>

可以看到 filtering标签为true,这代表启用了filtering模式。 那么filtering为true作用是什么?

  • filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name})
  • directory:指定资源文件的位置。

但是要注意,因为项目需要配置多环境需要使用 @profile.active@ ,因此配置了@ 方式进行替换,而非使用默认的 $ 符号。

# application.yml文件中
spring:
  # 配置采用那套环境,dev开发、beta测试、prod线上,主要是数据源不同。
  profiles:
    # 获取maven指定的环境
    active: @profile.active@

因此上面这段pom中内容主要含义:将src/main/resources下的所有@xxx@进行替换,具体替换原理请看Maven Profile相关内容,这里不做介绍。

问题解决

由于WOFF文件中存在较多@符号,因此上述配置导致WOFF文件原本内容被替换了,这导致浏览器解析时出错。
因此解决的核心在于避免WOFF文件在filtering下不被扫到。

  • 方案一:filtering模式启动时不对static目录下的内容进行替换。
    <build>
        <!--设定打包后包名,如果未指定则使用artifactId与version拼接-->
        <finalName>package-name</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <!-- 配置 @ 占位符 -->
                <configuration>
                    <encoding>utf-8</encoding>
                    <delimiters>
                        <delimiter>@</delimiter>
                    </delimiters>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 开启过滤,用指定的参数替换directory下的文件中的参数 -->
                <filtering>true</filtering>
                <!-- 使用filter先排除fonts/下文件,否则页面图标加载不出来 -->
                <excludes>
                    <exclude>static/fonts/**</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 不使用filter再将被排除的fonts/下文件,重新拷贝 -->
                <filtering>false</filtering>
                <includes>
                    <include>static/fonts/**</include>
                </includes>
            </resource>
        </resources>
    </build>
  • 方案二:nonFilteredFileExtensions标签 指定哪些后缀的文件不进行统一编码。
    <build>
        <!--设定打包后包名,如果未指定则使用artifactId与version拼接-->
        <finalName>package-name</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <!-- 配置 @ 占位符 -->
                <configuration>
                    <encoding>utf-8</encoding>
                    <delimiters>
                        <delimiter>@</delimiter>
                    </delimiters>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                    <!-- 过滤后缀为.woff或者.woff2或.tff的所有文件,不对其进行统一编码 -->
                    <nonFilteredFileExtensions>woff</nonFilteredFileExtensions>
                    <nonFilteredFileExtensions>woff2</nonFilteredFileExtensions>
                    <nonFilteredFileExtensions>tff</nonFilteredFileExtensions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 开启过滤,用指定的参数替换directory下的文件中的参数 -->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

如果有帮到你的话,给个免费的赞吧^ _ ^

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值