Spring Boot 2.5.6升级后spring.profiles.active占位符无法解析问题
排查方向
- 编译后产物检查
全局搜索默认仅扫描源码目录,首先到构建输出目录(target/classes、build/classes)下搜索所有.properties、.yml文件,确认是否有残留的${spring.profiles.active}占位符。若存在则检查pom.xml的<resources>过滤规则,是否有编译期占位符替换的异常配置。 - Maven插件参数传递规则适配
Spring Boot 2.4+ 对spring-boot-maven-plugin的参数传递逻辑做了调整,直接在命令后加-Dspring.profiles.active不会自动传递到应用进程,正确的启动命令写法为:
也可以在IntelliJ运行配置的「VM选项」栏单独添加mvn spring-boot:run -Dspring-boot.run.profiles=local -f pom.xml-Dspring.profiles.active=local确保参数生效。 - 外部配置源排查
按Spring Boot配置优先级,排查以下优先级高于项目内配置的来源是否有异常:- IntelliJ运行配置的「环境变量」栏是否有隐性的旧配置
- 操作系统的系统环境变量、用户环境变量是否有Spring相关的旧配置
- 项目中是否配置了
spring.config.import引入了外部配置文件,外部文件中可能存在旧占位符
- 依赖包隐藏配置排查
全局搜索默认不会扫描项目依赖的二方/三方包,可通过在启动类添加以下代码打印所有加载的配置源,定位带旧占位符的配置所在位置:@SpringBootApplication public class AppApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(AppApplication.class, args); ConfigurableEnvironment env = context.getEnvironment(); for (PropertySource<?> propertySource : env.getPropertySources()) { System.out.println("配置源名称:" + propertySource.getName()); } } } - 自定义扩展类排查
检查项目中是否存在自定义的ApplicationContextInitializer、EnvironmentPostProcessor、PropertySourceLoader实现类,这些类如果通过SPI机制注册,可能硬编码了对旧占位符的引用,不会被常规全局搜索命中。
补充纠正:
config.activate.on-profile是2.4+版本用于单配置文件多文档块场景下,标记当前配置块生效的profile条件,不是替代spring.profiles.active的激活配置项,应用的profile激活配置仍然使用spring.profiles.active即可,无需替换原有激活配置。
内容的提问来源于stack exchange,提问作者Swan-Work
相关产品推荐
相关产品推荐

