实际上已经找了很好的解决方案,教程为:
maven 2 - SLF4J:类路径包含多个 SLF4J 绑定 - Stack Overflow
写本篇博客是为了记录这次解决问题的过程。
报错
在运行项目时出现报错:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/fine/.m2/repository/ch/qos/logback/logback-classic/1.2.11/logback-classic-1.2.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/fine/.m2/repository/org/slf4j/slf4j-simple/1.7.36/slf4j-simple-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See [http://www.slf4j.org/codes.html#multiple_bindings](http://www.slf4j.org/codes.html#multiple_bindings) for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
原因
直接从报错内容进行分析:Class path contains multiple SLF4J bindings. 明显是依赖发生了冲突。
类路径中同时包含了两个不同的 SLF4J 绑定。
所以需要排除掉一个日志依赖。
解决
1. 寻找教程,加入exclusion 项失败
类似的教程很多,包括像找日志依赖,然后加入exclusion项。
但我直接往全局pom.xml文件里增加<exclusion>
项发现并没有消除这报错。
2. 失败复盘,java项目的构建和运行
实际上有两个可能有两个原因(我真的是java小白qwq),但是第一个原因我当时没有意识的。
- 我(好像)没有进行重新构建就直接运行,所以依赖项还是原来的依赖关系,所以会报错。
- 我的exclusion项添加错了地方,所以没有用。
这里牵涉到一个基础知识,就是java项目的运行步骤:
- 解析依赖:检查并下载项目所需的依赖库。
- 构建项目:
- 编译
.java
文件; - 处理资源文件;
- (如果需要)打包成
.jar
或.war
文件。
- 编译
- 启动 JVM:加载项目的类文件和依赖库,启动运行环境。
- 执行程序:运行主类的
main()
方法或框架的启动代码。
因此,当添加或移除依赖项时,通常需要重新构建以确保所有依赖都被正确解析。
3. 继续寻求方案,导致冲突的依赖项
看到个教程,评论区的说法吸引了我注意力。
在导致冲突的依赖项(共pom.xml)中
使用
`<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>`
有助于解决问题
怎么找到导致冲突的 依赖项 呢?
4. 寻找冲突依赖项,添加exclusion项
运行命令:mvn dependency:tree
,该命令可以检查项目之间的依赖关系,搜索slf4j-simple,找到依赖关系。
通过搜索依赖关系中的slf4j-simple
,找到的内容如下。
文字如下
| \- com.squareup.okhttp3:okhttp:jar:4.9.3:compile
[INFO] | | +- org.springframework.security:spring-security-core:jar:5.7.2:compile
[INFO] | | \- com.alibaba:dashscope-sdk-java:jar:2.16.2:compile
[INFO] | | +- io.reactivex.rxjava2:rxjava:jar:2.2.21:compile
[INFO] | | +- org.slf4j:slf4j-simple:jar:1.7.36:compile
[INFO] | | +- com.squareup.okio:okio:jar:3.6.0:compile
[INFO] | | | \- com.squareup.okio:okio-jvm:jar:3.6.0:compile
[INFO] | | \- com.github.victools:jsonschema-generator:jar:4.31.1:compile
可以看到slf4j-simple
是父依赖com.alibaba:dashscope-sdk-java
下的子依赖。
因此直接全局搜索com.alibaba
,(我真的很爱IDEA的全局搜索)。
在这个父依赖中增加exclusion项,其中groupId和artifactId就照着报错来写,或者说依赖关系来写。也就是 org.slf4j
和slf4j-simple
。
(没错,我就是小白,我开始甚至不知道怎么填这两个标签内容。)
完整的依赖项内容如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.16.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
然后重新构建,运行。
题外话
实际上网络中有非常多依赖冲突解决方案,并不缺我一个。
作为一个小白,我也并不能保证自己的思路是完全正确的。
但是在这个解决问题的过程中,我对于java的了解也有了新的收获,因此留个记录。