为何Maven构建未对application.yaml中的资源进行过滤?
问题分析与解决方案
核心原因
Maven默认的资源过滤规则不会自动包含.yaml/.yml文件,同时YAML本身的${}语法会和Maven的变量替换逻辑产生冲突,最终导致属性未被正确替换。
解决方案
方案1:明确指定需要过滤的YAML文件
在production profile的resource配置中添加includes节点,明确告诉Maven要对YAML文件执行过滤:
<profile> <!-- Production mode is activated using -Pproduction --> <id>production</id> <properties> <toto>coucou</toto> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.yaml</include> <include>**/*.yml</include> <!-- 保留原有需要过滤的资源类型,比如properties文件 --> <include>**/*.properties</include> </includes> </resource> </resources> </build> </profile>
方案2:修改Maven变量分隔符避免YAML冲突
如果YAML文件中本身有大量${}语法(比如Spring Boot的原生占位符),可以修改Maven的资源分隔符为@,彻底避免冲突:
- 在profile的properties中添加分隔符配置:
<profile> <id>production</id> <properties> <toto>coucou</toto> <!-- 用@作为Maven变量分隔符 --> <maven.resources.delimiter>@</maven.resources.delimiter> <!-- 禁用默认转义逻辑,防止干扰 --> <maven.resources.escapeString>\</maven.resources.escapeString> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.yaml</include> <include>**/*.yml</include> </includes> </resource> </resources> </build> </profile>
- 修改application.yaml中的引用方式:
vaadin: productionMode: @toto@
验证步骤
执行命令时添加-X参数查看Maven日志,确认:
- production profile已被激活(日志中会显示
Activated profiles: production) - 资源过滤逻辑已应用到application.yaml文件
- 属性
toto=coucou已被正确加载
内容的提问来源于stack exchange,提问作者Tyvain
相关产品推荐
相关产品推荐

