Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path 冲突解决

  |   0 评论   |   1,261 浏览

Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path 此冲突是由于此两包不兼容,不能同时存在. 原因是 log4j-over-slf4j.jar 只是一个桥接包. 而 bound (粘合)的slf4j-log4j12.jar 中既包含了桥接包,也包含了log4j2的实现.因此桥接部分有冲突. 所以需要选其一使用.

处理办法是只使用其中的一种组. 不混合交叉使用.

这个问题通常发生在使用 slf4j 和 log4j 的组合记录日志时,出现了两个日志框架互相依赖的情况。其中 log4j-over-slf4j.jar 是 slf4j 提供的一种适配器,在使用 slf4j-wrapped log4j 时使用的,而 slf4j-log4j12.jar 是 slf4j 和 log4j 集成的一个 jar 包。

这个问题的原因是,log4j-over-slf4j.jar 和 slf4j-log4j12.jar 都包含了 slf4j 和 log4j 的相关类。在应用程序的 classpath 上如果同时存在这两个 jar 包,就会出现类冲突,导致日志框架无法正确记录日志信息,出现不可预期的错误和异常。

解决这个问题的方法是,只选择使用其中一个日志框架并移除另一个依赖。如果选择使用 log4j,就需把 log4j-over-slf4j.jar 从 classpath 中排除,并只使用 slf4j-log4j12.jar。反之亦然,如果选择使用 slf4j,就需把 slf4j-log4j12.jar 从 classpath 中排除,并确保只使用 log4j-over-slf4j.jar。

方法1 保留log4j-over-slf4j

此时,这个包只是一个单纯的桥接包. 如果要正常使用. 那就真正需要一个实现包. 可以是lo4j, 也可以是log4j2, 也可以是logback.

我们建议保留log4j-over-slf4j.jar这个文件,因为它可以更好地与其他日志框架集成,并且不需要依赖log4j本身。删除slf4j-log4j12.jar这个文件通常不会影响应用程序的正常运行

这个实际是说slf4j框架的实现不是使用的log4j, 这个时候就可以移除掉 slf4j-log4j12.jar ,比如我们的实现是log4j2 或者说是logback

方法2 保留 slf4j-log4j12.jar

这个说明我们的 slf4j日志框架的最张后端实现就是 使用的log4j. 因此, 我们不需要把 log4j的实现桥接到 slf4j上去. 因为这样会让人产生误解. 因为桥接到了slf4j , 最终的实现还是适配到了 log4j. 这个的后果就是产生循环依赖.或者是降低不必要的两次转发.

因此,这个时候说明我们的使用的slf4j的实现一定是 log4j. 这个时候,如果有其它的日志实现,则需要排除掉. 比如 依赖了 logback. 这个时候就需要把logback-classic依赖排除.

评论

发表评论


取消