maven编译后资源文件内容发生变更问题随记

现象描述

最近做的个功能需要将字体文件放入common.jar中提供读取加载字体,然后发现将字体放在web项目中编译出来的大小和common.jar编译出来的大小不同,而且放在common.jar中的无法被加载。初步猜测maven在编译过程对ttf文件做了什么手脚。

解决

然后一个个对比web项目和common项目的pom文件,把common多出来的build配置项一个个删除尝试,最后定为在

<build>
    <resources>
        <resource>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

apache关于filtering官方描述
用于替换资源文件中的变量值。
在我们项目中原意用该功能来区分是测试环境还是线上环境,读取不同文件夹下的资源文件,现在加入字体文件或者图片文件在资源目录下交由maven编译可能导致${xxx}的内容被编译替换为变量值导致字体文件或图片文件不可用。
可以看到在官方描述最后的warning也有相关提示

Warning: Do not filter files with binary content like images! This will most likely result in corrupt output. If you have both text files and binary files as resources, you need to declare two mutually exclusive resource sets. The first resource set defines the files to be filtered and the other resource set defines the files to copy unaltered as illustrated below:

当然这里可以采用官方的方式指定哪些文件可使用占位符或者指定哪些文件不可用占位符。
我个人认为最好还是不要采用filtering,避免今后产生未知问题定位麻烦。如果要区分不同环境的资源文件还有其他方式实现,比如在profile指定变量名,在resources直接根据变量名指定有哪些文件夹即可。

    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>env.type</name>
                    <value>dev</value>
                </property>
            </activation>
            <properties>
                <env.dir>env/dev</env.dir>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <env.dir>env/test</env.dir>
            </properties>
        </profile>
        <profile>
            <id>online</id>
            <properties>
                <env.dir>env/online</env.dir>
            </properties>
        </profile>
    </profiles>
    <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>env/**/*</exclude>
                    <exclude>**/.svn/*</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources/${env.dir}</directory>
                <excludes>
                    <exclude>**/.svn/*</exclude>
                </excludes>
            </resource>
        </resources>

你可能感兴趣的:(maven编译后资源文件内容发生变更问题随记)