resources目录下${project.version}未替换,因Maven默认仅对src/main/resources启用filtering且需显式配置<filtering>true</filtering>,自定义属性须在<properties>声明或命令行传入,YAML过滤易致格式错误,应优先用properties格式。

为什么 resources 目录下的配置文件里写 ${project.version} 却没被替换?
根本原因是 Maven 默认只对 src/main/resources 下的文件做 filtering,且必须显式开启——不是加了 ${...} 就自动替换。
实操建议:
- 确认你已在
pom.xml的<build><resources>段落中为对应资源目录设置了<filtering>true</filtering> - 确保变量本身可解析:比如
${project.version}是内置属性,但自定义属性(如${env})必须在<properties>里声明,或通过-Denv=prod命令行传入 - 注意路径匹配逻辑:如果用了
<includes>,默认会忽略所有未显式包含的文件;建议先用<includes><include>**/*.properties</include></includes>锁定范围
多个环境打包时,如何让 application.properties 里的 ${db.url} 替换成不同值?
靠 Maven 的 profiles + 资源 filtering 组合实现,关键在 profile 内部定义属性,并绑定到对应资源过滤流程。
实操建议:
- 在
<profiles>中定义 dev/test/prod profile,每个 profile 里用<properties>设置db.url等值 - 把资源目录按 profile 分开(如
src/main/resources-dev),并在 profile 中用<resources>指向它,同时设<filtering>true</filtering> - 避免直接在
src/main/resources里混写多套配置——Maven 不支持“条件化替换同一文件中的某几行”,只能靠文件级隔离或外部属性注入
maven-resources-plugin 版本不写会出什么问题?
不声明版本时,Maven 可能选用老版本插件(如 2.6),而老版本对 encoding、nonFilteredFileExtensions 支持弱,甚至默认禁用 filtering。
实操建议:
- 显式声明插件版本,推荐
3.3.1(截至 2024 年稳定兼容 JDK 8–17) - 务必配
<encoding>UTF-8</encoding>,否则含中文的 properties 文件可能乱码 - 若要跳过某些二进制文件(如
.png、.jar),加上<nonFilteredFileExtensions><extension>png</extension></nonFilteredFileExtensions>,否则它们可能被当作文本错误解析
Spring Boot 项目里,application.yml 用 filtering 后启动报错:Invalid YAML?
因为 YAML 对缩进和冒号后空格极其敏感,而 filtering 过程若不小心引入多余空格、换行或未闭合的占位符(如只剩 ${db),YAML 解析器直接失败。
实操建议:
- 优先改用
.properties格式做 filtering,更鲁棒;YAML 仅用于静态结构 - 若坚持用 YAML,确保所有
${...}占位符前后无空格,且完整闭合;可用mvn resources:resources后检查target/classes/下生成的文件内容 - 不要在 YAML 的 map key 或 list item 上直接写
${xxx}——例如${profile}.datasource.url作为 key 是非法的,YAML 不支持动态 key
最常被忽略的是:filtering 发生在 process-resources 阶段,早于编译;所以任何依赖编译产物的变量(比如 ${my.custom.property.from.another.module})在该阶段不可用——得换思路,用运行时配置中心或 Spring 的 @Value 注入替代。










