在Maven项目构建过程中,资源文件里的动态变量替换是常见需求,尤其是XML格式的配置文件,经常需要把环境相关的参数通过构建过程自动填充,避免手动修改带来的错误。Maven的资源过滤机制可以很好地实现这个功能,下面介绍具体的实现方式。

Maven资源过滤基础配置
要实现XML资源文件的变量过滤,首先需要在pom.xml中开启资源过滤功能,默认情况下Maven不会处理资源文件中的占位符,需要手动配置<resources>标签。
开启资源目录过滤
在pom.xml的<build>节点下添加<resources>配置,指定需要过滤的资源目录,同时设置<filtering>为true:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
上述配置表示对src/main/resources目录下的所有资源文件开启过滤,Maven在构建时会扫描该目录下的文件,替换其中的占位符。
定义过滤变量
过滤的变量可以定义在pom.xml的<properties>节点中,也可以定义在外部的属性文件里。首先在pom.xml中定义基础属性:
<properties>
<db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
<db.username>root</db.username>
<db.password>123456</db.password>
</properties>
然后在XML资源文件中使用${属性名}的格式引用这些变量,比如创建一个spring-datasource.xml文件放在src/main/resources目录下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
</beans>
执行mvn clean package命令构建项目后,查看target/classes目录下的spring-datasource.xml文件,会发现${db.url}等占位符已经被替换成了pom中定义的具体值。
多环境资源过滤配置
实际开发中通常需要区分开发、测试、生产等不同环境,每个环境的变量值不同,这时候可以结合Maven的profile功能实现多环境过滤。
定义多环境profile
在pom.xml中添加不同环境的profile配置,每个profile定义对应环境的属性:
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<db.url>jdbc:mysql://127.0.0.1:3306/dev_db</db.url>
<db.username>dev_user</db.username>
<db.password>dev_pass</db.password>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<db.url>jdbc:mysql://192.168.0.1:3306/test_db</db.url>
<db.username>test_user</db.username>
<db.password>test_pass</db.password>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<db.url>jdbc:mysql://ipipp.com:3306/prod_db</db.url>
<db.username>prod_user</db.username>
<db.password>prod_pass</db.password>
</properties>
</profile>
</profiles>
默认激活的是dev环境,如果要构建测试环境的包,可以执行mvn clean package -Ptest命令,Maven会自动使用test profile中定义的属性替换XML中的占位符。
XML特殊字符的处理
XML文件对特殊字符有严格的转义要求,如果变量值中包含<、>、&等特殊字符,直接放在属性中会导致XML语法错误,需要做对应的处理。
属性值转义方式
如果变量值包含XML特殊字符,可以在pom的属性定义中使用XML实体转义,比如属性值包含&符号:
<properties>
<param.value>key1=value1&key2=value2</param.value>
</properties>
对应的XML资源文件中引用该变量:
<property name="param" value="${param.value}"/>
构建后替换的结果会是key1=value1&key2=value2,符合XML的语法要求。
使用CDATA段包裹变量
如果变量值包含大量特殊字符,也可以使用XML的CDATA段来包裹变量引用,避免转义问题:
<property name="content">
<value><![CDATA[${content.value}]]></value>
</property>
这样即使content.value中包含特殊字符,只要内容本身符合CDATA的规则,就不会出现XML解析错误。
过滤范围控制
如果不想对所有资源文件都开启过滤,可以细化资源配置,比如只对.xml文件开启过滤,其他文件不处理:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
</resources>
</build>
上述配置表示只对resources目录下的xml文件开启过滤,其他类型的文件不做过滤处理,避免不必要的占位符替换导致文件内容异常。
常见问题排查
- 变量未替换:检查<filtering>是否设置为true,资源文件路径是否配置正确,占位符格式是否为
${属性名} - XML解析错误:检查变量值是否包含未转义的特殊字符,是否可以使用CDATA段处理
- 多环境不生效:检查profile的id是否正确,激活命令是否带了-P参数,默认profile是否配置正确
MavenXML_resource_filteringpom.xmlmaven_resources_plugin修改时间:2026-06-27 08:06:19