默认
发表评论 11
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] Spring boot中MobileIMSDK报log4j-slf4j-impl log4j-to-slf4j冲突
阅读(197) | 评论(11 收藏 淘帖
我发现spring boot 3.1.0 如果引用mobileimsdkServer_open源码,再运行项目会报Exception in thread "main" java.lang.ExceptionInInitializerError        at top.xiewenwen.im.Application.main(Application.java:10)
Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j我AI了一下,他说冲突,于是我把源码引入的log4j-slf4j-impl移除,又会继续报错,请问我改怎么办。而且我没有发现 哪里引用了 log4j-to-slf4j这个包,有可能是spring自带的,我不是很清楚。



即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复] 1000用户用 MobileIMSDK 高并发,用什么配置服务器
推荐方案
评论 11
参考[日志管理] 启动程序时,因报“log4j-slf4j-impl cannot be present with log4j-to-slf4j”错误而导致程序终止运行[转发] 》,看看能不能解决。

不行就参考论坛里其他人用的Spring boot搞的工程,里面有源码的你可以直接下载源码工程,对照一下看看:

适合萌新的Spring boot集成MobileIMSDK实践分享》(文末有源码工程可以下载
SpringBoot集成开源IM框架MobileIMSDK,实现即时通讯IM聊天功能
引用:JackJiang 发表于 2025-03-14 10:51
参考《[日志管理] 启动程序时,因报“log4j-slf4j-impl cannot be present with log4j-to-slf4j”错误而导 ...

他们是引用已经打包好的 jar,我是直接引用 源码项目运行
引用:921124136 发表于 2025-03-14 10:53
他们是引用已经打包好的 jar,我是直接引用 源码项目运行

打包也不会打包别的什么东西进去,没有本质区别,所以你可以用别人的工程去试试,然后再对照你的工程配置
引用:JackJiang 发表于 2025-03-14 11:02
打包也不会打包别的什么东西进去,没有本质区别,所以你可以用别人的工程去试试,然后再对照你的工程配置

就是我不想从libs引用,我想引用上面源码,直接改里面的东西使用,但是引用上面的源码就会报这种错误
引用:921124136 发表于 2025-03-14 11:09
就是我不想从libs引用,我想引用上面源码,直接改里面的东西使用,但是引用上面的源码就会报这种错误

我的意思是,你可以用别人引用lib的工程先跑不报错了,你再把Lib删掉替换成源码呗,是这个意思
引用:JackJiang 发表于 2025-03-14 11:16
我的意思是,你可以用别人引用lib的工程先跑不报错了,你再把Lib删掉替换成源码呗,是这个意思

引用jar肯定能跑,就是直接引用源码跑不了,报上面的错
引用:921124136 发表于 2025-03-14 11:22
引用jar肯定能跑,就是直接引用源码跑不了,报上面的错

jar就是源码打出来的,理论上都是同一个东西,所以应该是另有原因,你再排查排查
引用:JackJiang 发表于 2025-03-14 11:45
jar就是源码打出来的,理论上都是同一个东西,所以应该是另有原因,你再排查排查

好的,jack哥
引用:JackJiang 发表于 2025-03-14 11:45
jar就是源码打出来的,理论上都是同一个东西,所以应该是另有原因,你再排查排查

直接引入和打成 JAR 的本质区别就是 类加载的方式。

1. 为什么源码引入会报错?
当你直接引入 MobileIMSDKServer_Open 的源码,它的所有依赖(包括 Log4j、SLF4J)都会被你的主项目的类加载器直接加载,这就会导致 Spring Boot 发现 Logback 和 Log4j 的冲突。

错误的关键点是:

Spring Boot 默认使用 Logback 作为日志框架。
但 MobileIMSDKServer_Open 可能用到了 Log4j(或 log4j-slf4j-impl),导致 Spring Boot 发现 Logback 和 Log4j 同时存在,抛出异常。
2. 为什么打成 JAR 不会报错?
当你把 MobileIMSDKServer_Open 打成 JAR 并引入,JAR 里面的 META-INF/MANIFEST.MF 文件不会主动告诉你的主项目该用哪些日志库,主项目的依赖优先级更高,所以:

如果你的主项目默认用 Logback,JAR 内部的 Log4j 相关内容不会主动生效,不会导致冲突。
引用:921124136 发表于 2025-03-14 14:43
直接引入和打成 JAR 的本质区别就是 类加载的方式。

1. 为什么源码引入会报错?

Logback本身就没有log4j2性能好。你要么这样,要用源码的情况下,如果还是不能解决冲突,就把log4j改成logback吧,都是统一的类在使用,也没什么更换成本,一个日志框架而已
引用:JackJiang 发表于 2025-03-14 19:27
Logback本身就没有log4j2性能好。你要么这样,要用源码的情况下,如果还是不能解决冲突,就把log4j改成lo ...

是的,我要改源码的日志框架才能用
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部