【问题标题】:How to exclude multiple SLF4J bindings to LOG4J如何排除多个 SLF4J 绑定到 LOG4J
【发布时间】:2023-03-18 07:58:01
【问题描述】:

我收到了错误

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.apache.logging.log4j/log4j-slf4j-impl/2.0-beta8/jar/15984318e95b9b0394e979e413a4a14f322401c1/log4j-slf4j-impl-2.0-beta8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.slf4j/slf4j-log4j12/1.5.0/jar/aad1074d37a63f19fafedd272dc7830f0f41a977/slf4j-log4j12-1.5.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

在我的 build.gradle 文件中,我有以下行来包含 jar log4j-slf4j-impl-2.0-beta8.jar(我想绑定到 LOG4J2)

 compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.0-beta8' 

在依赖项目的另一个 build.gradle 文件中,我有多行类似于以下内容:

 compile 'dcm4che:dcm4che-core:2.0.23'

现在 dcm4che 包含对 log4j 版本 1 (slf4j-log4j12) 的依赖,因此它包含在整个项目中。

这是来自 Gradle 依赖树的 sn-p:

|    +--- dcm4che:dcm4che-core:2.0.23
|    |    \--- org.slf4j:slf4j-log4j12:1.5.0
|    |         +--- org.slf4j:slf4j-api:1.5.0 -> 1.7.5
|    |         \--- log4j:log4j:1.2.13 -> 1.2.14

我已阅读链接suggested in the warning,但我不知道如何使用我想要的 jar 使我的应用程序绑定到 log4j2。 Gradle 关于依赖管理的文档并没有真正让它变得更清晰。

【问题讨论】:

    标签: java logging gradle slf4j log4j2


    【解决方案1】:

    将此代码放入您的build.gradle 文件中

    configurations.all {
       exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
    

    【讨论】:

      【解决方案2】:

      解决方法是在build.gradle中添加以下内容。

      configurations.all {
          resolutionStrategy.eachDependency { DependencyResolveDetails details ->
              if (details.requested.name == 'log4j') {
                  details.useTarget "org.slf4j:log4j-over-slf4j:1.7.5"
              }
      }
      

      结果是任何通常需要 log4j 的东西都将使用 log4j-over-slf4j。

      我还补充了:

      if (details.requested.name == 'commons-logging') {
          details.useTarget "org.slf4j:jcl-over-slf4j:1.7.5"
      }
      

      为了完整地涵盖公共日志记录。

      【讨论】:

      • 应该使用 log4j-1.2-api jar 将 log4j 1.x 调用路由到 log4j2,而不是路由到 slf4j。
      • @rgoers:仅仅添加 log4j-1.2-api jar 并不能解决多依赖问题。
      【解决方案3】:

      排除包含您想要使用的 slf4j .jar 的依赖项。对于 gradle this 可能会有所帮助。

      更新:

      不幸的是我不熟悉gradle,但从链接的文档来看……。喜欢

      compile('dcm4che:dcm4che-core:2.0.23') {
         exclude group: 'org.slf4j'
      }
      

      可以吗?请注意,文档中提到了一种“配置全局”排除列表,这可能是一种更好的方法,但我没有找到更多相关信息。

      【讨论】:

      • 是的,这确实正是我想要做的。我只是无法从 Gradle 文档中弄清楚如何做到这一点。
      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2018-07-10
      • 2013-10-01
      • 2012-09-28
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多