Spring Boot 里 ConfigurationProperties 不起作用?踩坑记录与排查思路
把工作中遇到的 @ConfigurationProperties 配置绑定失效场景整理了一下,从依赖、注解、配置文件到多模块扫描,附带直接可用的示例。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-29 12:00:45 SLF4J Tomcat Spring Boot 日志冲突 Log4j2
线上部署一个Spring Boot应用,打war包扔进Tomcat,结果起不来。
看日志,关键信息是 LifecycleException,容器在启动 StandardContext[/apiplatformback] 的时候直接挂掉。再往上翻,SLF4J 报了一行:
实际绑定的是 org.apache.logging.slf4j.Log4jLoggerFactory,但又提示 LoggerFactory is not a Logback LoggerContext but Logback is on the classpath。
这就很明确了——classpath 里同时有 Log4j2 和 Logback 的 SLF4J 实现,两边都在抢绑定,最后把日志初始化搞炸了,进而导致应用上下文起不来,Tomcat 这边直接抛 LifecycleException。
最开始瞄一眼日志,我还以为是 Log4j2 配置写的有问题,后来看了冲突报错才反应过来是 jar 包冲突。这个坑很多人第一次遇到会绕进去,因为 Spring Boot 默认带的就是 Logback,如果你又在依赖里显式引了 log4j-slf4j-impl,双方一碰面,线上跑起来问题就出来了。
排查的时候顺手看了下具体打包进了哪些日志实现。日志里能看到冲突来源之一就是 log4j-slf4j-impl-2.17.2.jar,Logback 的 jar 虽然没有直接点名,但既然提示 Logback 在 classpath 上,基本就是 spring-boot-starter-logging 传递进来的 logback-classic。
解决思路就是只留一个 SLF4J 绑定。如果项目确定走 Log4j2,那就把所有跟 Logback 相关的东西踢出去。
核心操作:在引入 spring-boot-starter-web 的时候排除 spring-boot-starter-logging,然后显式加上 spring-boot-starter-log4j2。Maven 的写法:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
Gradle 的话,可以用全局排除的方式,或者针对具体依赖做 exclude。一种写法:
configurations {
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}
光排除 starter-logging 不一定就完事了,因为其他第三方依赖也可能间接把 logback-classic 拖进来。所以最好跑一下依赖树看看。
Maven:mvn dependency:tree
Gradle:gradle dependencies
在树里搜 logback,如果发现某个依赖偷偷带进来了,就把它也排除掉,比如:
<dependency>
<groupId>some.group</groupId>
<artifactId>some-artifact</artifactId>
<version>x.y.z</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖冲突清干净之后,还要保证 Log4j2 的配置文件存在。一般放在 src/main/resources 下面,log4j2.xml 或者 log4j2-spring.xml 都行。一个最简的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
最后清理重新构建,mvn clean package 或者 gradle clean build,重新部署到 Tomcat,启动就正常了。
这事的根因就是 SLF4J 绑定冲突——Log4j2 和 Logback 同时存在。只要确保 classpath 里只有一个绑定实现,问题就消掉了。
后续最好养成习惯,上线前跑一下依赖树扫一眼日志相关的 jar,省得到了生产环境半夜报警把自己叫起来。
把工作中遇到的 @ConfigurationProperties 配置绑定失效场景整理了一下,从依赖、注解、配置文件到多模块扫描,附带直接可用的示例。
厌倦了数据裸奔?本指南将以犀利笔触,手把手教你在Tomcat上为FineReport披上SSL安全外衣,实现HTTPS加密访问,彻底告别单点登录的信任危机,让您的数据在互联网的狂野西部中也能安全驰骋。
本文深入剖析Spring Boot中ConfigurationProperties注解无法正常加载配置的常见原因,从依赖、注解、配置文件到IDE缓存和多模块项目,提供详细排查步骤与调试技巧,助您快速定位并修复问题,确保配置高效生效。