【Java学习记录】SLF4J日志冲突解决过程记录logback-classic和slf4j-simple冲突

实际上已经找了很好的解决方案,教程为:
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项目的运行步骤:

  1. 解析依赖:检查并下载项目所需的依赖库。
  2. 构建项目
    • 编译 .java 文件;
    • 处理资源文件;
    • (如果需要)打包成 .jar.war 文件。
  3. 启动 JVM:加载项目的类文件和依赖库,启动运行环境。
  4. 执行程序:运行主类的 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.slf4jslf4j-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的了解也有了新的收获,因此留个记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值