Spring集成JUnit测试时Log4j依赖冲突问题求助
解决JUnit测试中log4j-slf4j-impl与log4j-to-slf4j冲突问题
问题背景
服务运行正常,但执行JUnit测试时抛出以下错误:
Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
问题原因
log4j-slf4j-impl与log4j-to-slf4j是互斥的日志桥接依赖:
log4j-slf4j-impl负责将SLF4J日志请求委托给Log4j2处理log4j-to-slf4j负责将Log4j2自身的日志请求转交给SLF4J接口输出
两者同时存在会导致日志流转的循环依赖,触发冲突报错。
解决步骤
1. 排查依赖树
先通过构建工具命令找出哪个依赖间接引入了冲突包:
- Maven:
mvn dependency:tree
- Gradle:
gradle dependencies
在输出结果中定位包含log4j-slf4j-impl或log4j-to-slf4j的依赖项。
2. 排除冲突依赖
根据依赖树的结果,在spring-boot-starter-test依赖中排除其中一个冲突包。例如:
如果检测到log4j-slf4j-impl被引入,修改pom.xml如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency>
如果冲突源是log4j-to-slf4j,则替换排除对应的artifactId即可。
3. 检查其他依赖
如果排除后仍有报错,检查项目中其他依赖是否也引入了这两个冲突包,重复排除操作直至消除所有冲突。
额外提示
业务类中的日志初始化建议使用SLF4J标准的LoggerFactory(确保导入正确的包):
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserBusinessService { static Logger logger = LoggerFactory.getLogger(UserBusinessService.class); // ... 其他代码 }
内容的提问来源于stack exchange,提问作者kernel
相关产品推荐
相关产品推荐

