SpringBoot定时任务报错:log4j-slf4j-impl与log4j-to-slf4j冲突
问题描述
运行SpringBoot定时任务POC的producer方法时触发以下错误:
Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
已知spring-boot-starter-web依赖需要log4j-to-slf4j,已手动注释build.gradle中的log4j-slf4j-impl依赖,但错误仍未解决。
已尝试操作
- 删除
~/.m2/repository缓存,依赖仍显示 - 在IntelliJ中执行Invalidate Caches(清除文件系统缓存、本地历史及共享索引),外部库仍存在该依赖
- 执行
./gradlew dependencyInsight --dependency log4j-slf4j-impl未找到匹配依赖,但仍报错且能看到依赖 - 执行
./gradlew cleanBuildCache提示任务不存在 - 删除
~/.gradle/caches并执行./gradlew clean build --refresh-dependencies,问题未解决
可行排查&解决步骤
强制排除隐式传递依赖
即使dependencyInsight未查到,可能是第三方依赖间接引入了log4j-slf4j-impl,在build.gradle的核心依赖块中强制排除:implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' } // 其他可能引入该依赖的模块,同样添加排除规则检查本地Jar包
确认项目的lib目录(若存在)中是否有手动添加的log4j-slf4j-impl.jar,如有直接删除。通过IntelliJ依赖视图定位来源
打开IntelliJ的Project Structure -> Libraries,找到log4j-slf4j-impl后右键选择Show in Project View,查看它的引入路径,针对性排除。排查Gradle脚本的隐藏配置
检查build.gradle中allprojects、subprojects块,或自定义依赖配置、插件是否自动引入了该依赖。生成完整依赖报告定位
生成全量依赖报告并搜索log4j-slf4j-impl的踪迹:./gradlew dependencies > dependencies.txt打开
dependencies.txt全局搜索关键词,找到具体引入路径。
内容的提问来源于stack exchange,提问作者Hofbr

