问题:
部署SringBoot项目到tomcat出现下面的警告。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/yangqian/workspace/idea/ule-ai/target/ule-ai-beta-0.0.1-SNAPSHOT/WEB-INF/lib/slf4j-log4j12-1.7.26.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/yangqian/workspace/idea/ule-ai/target/ule-ai-beta-0.0.1-SNAPSHOT/WEB-INF/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
02-Aug-2019 11:21:08.121 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ai]]
原因分析:
大概意思是说logback-classic
包和slf4j-log4j12
包,关于org/slf4j/impl/StaticLoggerBinder.class
这个类发生了冲突。
发生这个错误的原因,首先logback
日志的开发者和log4j
的开发者是一波人,而springboot
默认日志是较新的logback 日志。但是以前流行的日志却是log4j
,而且很多的第三方工具都含有log4j
得引入。
而我们在项目开发中,难免会引入各种各样的工具包,所以,基本上springboot
项目,如果不注意,肯定会出现这种冲突的。
问题隐患:
在开发工具中运行,对,没毛病,一般会正常启动。
发现将springboot 配置成tomcat运行 ,即修改成war 包之后,就会出现这个警告,一般这个警告没有什么影响;尽管你在开发工具中能正常运行,也可能在打完包之后不能运行。
解决方案:
既然抛了jar
包冲突 ,那我们就排除一个jar
包即可。关键是排除哪一个jar
包 ,这里注意下了,如果你用的是logback
日志,一定要排除slf4j-log4j12
包,不要排除logback-classic
包。
找到pom.xml 文件,idea
可以看引入jar
包的联系,可以这样看到你的依赖结构:
可以看到dfs-uploadclient
包中默认引入了slf4j-log4j12
包,并且提示这里的log4j jar
有冲突,除此之外,springboot
一定引入的spring-boot-starter-web
包,它里边也有这个slf4j-log4j12
引入。
只要排除dfs-uploadclient
包中的 slf4j-log4j12
即可。
如下:
<dependency>
<groupId>com.ule.dfs</groupId>
<artifactId>dfs-uploadclient</artifactId>
<version>${env}-1.1.5.7</version>
<exclusions>
<!--排除这个slf4j-log4j12-->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>