Skip to content

Maven 资源文件占位符使用

Maven 官方文档:

https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

简介

Maven 支持在处理资源文件时替换文件中的占位符。常见形式包括文本文件中的 ${...},以及部分 yml 文件中使用的 @...@

这些占位符对应的值可以来自系统属性、项目属性、过滤器资源或命令行参数。

使用方法

使用前,需要先开启 resources 过滤。例如,以下配置会对 src/main/resources 路径下的文件启用过滤:

xml
<project>
    ...
    <build>
        <!-- 如果未配置 resource,application.yaml 中的 @@ 占位符将无法读取 pom 中的属性 -->
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        ...
    </build>
    ...
</project>

注意事项

资源过滤可能会破坏二进制文件。如果目标目录中包含二进制文件,可通过以下两种方式规避。jpgjpeggifbmppng 类型文件默认会被忽略,通常无需额外处理。

第一种方法

maven-resources-plugin 中配置需要排除的文件后缀名:

xml
<project>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    ...
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
                        <nonFilteredFileExtension>swf</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                    ...
                </configuration>
            </plugin>
        </plugins>
        ...
    </build>
    ...
</project>

第二种方法

build.resources 中配置多个 resource。在开启 filteringresource 中仅处理文本资源,在关闭 filteringresource 中包含需要原样复制的文件:

xml
<project>
    ...
    <build>
        <!-- 如果未配置 resource,application.yaml 中的 @@ 占位符将无法读取 pom 中的属性 -->
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.yaml</include>
                </includes>
            </resource>
            <resource>
                <filtering>false</filtering>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>**/*.yml</exclude>
                    <exclude>**/*.yaml</exclude>
                </excludes>
            </resource>
        </resources>
        ...
    </build>
    ...
</project>