Maven Profile 必须显式用 -P 激活,IDE 不识别 true;资源过滤需在 内配 filtering=true 并确保路径、大小写、includes/excludes 正确;Maven Profile(构建时资源替换)与 Spring Boot Profile(运行时配置加载)是两套独立机制,不可混用。

profile 必须显式用 -P 激活,IDE 默认不认 true
你在 pom.xml 里写了 <activebydefault>true</activebydefault>,IDE(IntelliJ/Eclipse)大概率不会按这个激活 profile。它只读自己缓存的构建配置,不解析 Maven 运行时状态。
真正生效的方式只有命令行显式指定:mvn clean package -Pdev。IDE 要同步,得手动设置:Maven → 勾选 “Always update snapshots” 和 “Import Maven projects automatically”,否则连 -P 都可能被忽略。
别用 <os></os> 或 <file></file> 这类隐式激活——本地 JDK 小版本一变、文件路径大小写一错,profile 就失效。统一走 -Pxxx 最稳。
资源过滤必须配对:filtering + includes + 正确路径
变量没替换、打包后还留着 ${db.url}?八成是资源过滤没配对。
-
<filtering>true</filtering>必须加在对应<resource></resource>块里,不是整个<resources></resources>下加一次就完事 - 如果用
<includes><include>config-${env}.properties</include></includes>,那src/main/resources/下必须有config-dev.properties这类文件,且${env}的值得来自 profile 的<properties></properties> - 路径区分大小写:
Config-dev.properties在 Linux 下就是找不到,Maven 静默跳过,日志只写 “Filtering skipped for file”
更稳妥的做法是把 filter 文件统一放 src/main/filters/dev.properties,再显式声明:<filter>src/main/filters/dev.properties</filter>。
Maven Profile 和 Spring Boot profile 是两套机制,别混用
这是最容易踩坑的地方:Maven 的 -Pprod 不等于 Spring Boot 启动时的 --spring.profiles.active=prod。
- Maven profile 控制的是打包时的资源替换(比如把
${db.url}替成生产库地址) - Spring Boot profile 控制的是运行时加载哪个
application-prod.yml,以及哪些@Profile("prod")Bean 生效 - 如果你在
application-prod.yml里又写spring.profiles.active: prod,会触发冗余激活甚至循环加载
正确做法:Maven 只负责把占位符替换成真实值;Spring Boot 的 profile 由启动参数或 application.yml 顶层的 spring.profiles.active 控制——两者解耦,各干各的。
打包后 application.yml 还有 ${},说明 filtering 根本没跑
现象:执行 mvn clean package -Pprod,结果 target/classes/application.yml 里全是 ${db.url},不是报错,而是原样保留。
原因通常就三个:
-
<resources></resources>的<directory></directory>指向错了目录,比如写成src/main/config却没这个目录 -
<filtering></filtering>写在了错误的<resource></resource>块里,或者被父 POM 覆盖了 - 你用了
<includes></includes>但没配<excludes></excludes>,导致其他 resource 块把未过滤的原始文件又拷进去了
验证方式:执行 mvn process-resources -Pprod -X,看 debug 日志里有没有 “Copying resource … with filtering” —— 没这句,说明 filtering 没触发。

















