多个SLF4J绑定会导致错误?

Bif*_*ffy 14 java dependencies slf4j maven

我的依赖树和多个SLF4J绑定有问题.到目前为止我发现的是,通常这只会引起警告但在我的情况下它似乎阻止我的程序运行:这些是我得到的例外:

SLF4J:类路径包含多个SLF4J绑定.SLF4J:在[jar:file:/ C:/Users/FischerNi/.m2/repository/org/slf4j/slf4j-jdk14/1.5.3/slf4j-jdk14-1.5.3.jar!/ org/slf4j /中找到绑定impl/StaticLoggerBinder.class] SLF4J:在[jar:file:/ C:/Users/FischerNi/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar中找到绑定!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J:有关说明,请参见http://www.slf4j.org/codes.html#multiple_bindings.SLF4J:slf4j-api 1.6.x(或更高版本)与此绑定不兼容.SLF4J:您的绑定是1.5.5或更早版本.SLF4J:将绑定升级到1.6.x版.或者2.0.x线程"main"中的异常java.lang.NoSuchMethodError:org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;

这是我的依赖项的相关部分:net.lightbody.bmp browsermob-proxy 2.0-beta-8

    <!-- LOGGING DEPENDENCIES - LOG4J -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何解决这个问题吗?

Ank*_*hag 27

有几种解决方案:

  • 如果你的类路径中有几个不同的版本,请确保只包含一个slf4j jar(可能是更高版本).
  • 有时可能无法排除多个slf4j罐子,因为它们可能被内部的其他罐子使用,这些罐子位于类路径上.这些依赖jar可能会引用slf4j jar的不同版本,这会导致应用程序失败.在这种情况下,请确保在使用SLF4J罐的其他罐之前添加了更高版本的SLF4j的jar.这将确保您的java程序将获取最新版本的SLF4J,这显然是向后兼容的.

  • 在项目构建路径中首先指定最新的一个.验证订单检查项目的.classpath文件.它将显示添加jar文件的顺序. (3认同)

小智 10

Fateh 的回答是正确的,我不得不花一些时间来弄清楚如何使用它,这就是为什么我要添加一个完整的解决方案:

  1. mvn dependency:tree

  2. 找出哪个库正在使用 slf4j:

    [INFO] +- net.lightbody.bmp:browsermob-proxy:jar:2.0-beta-8:compile
    [INFO] |  +- org.slf4j:slf4j-jdk14:jar:1.7.25:compile
    
    Run Code Online (Sandbox Code Playgroud)
  3. 像这样从 maven 中排除它:

         <dependency>
            <groupId>net.lightbody.bmp</groupId>
            <artifactId>browsermob-proxy</artifactId>
            <version>2.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-jdk14</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
    Run Code Online (Sandbox Code Playgroud)


Fat*_*teh 5

如果您的项目依赖于其他项目,而另一个项目也使用 slf4j 以及不同版本,请尝试使用excusion

<exclusions>
   <exclusion>
       <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </exclusion>
</exclusions>
Run Code Online (Sandbox Code Playgroud)