多个SLF4J绑定会导致错误?

时间:2013-10-29 11:06:18

标签: java maven dependencies slf4j

我的依赖树和多个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代理             2.0-β-8         

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

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>

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

6 个答案:

答案 0 :(得分:25)

有几种解决方案:

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

答案 1 :(得分:3)

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

<exclusions>
   <exclusion>
       <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </exclusion>
</exclusions>

答案 2 :(得分:3)

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

  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
    
  3. 像这样从行家中排除它:

         <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>
    

答案 3 :(得分:1)

我建议在maven中使用以下依赖项,

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

这解决了我的问题,尽管我使用slf4j有更多的依赖。

答案 4 :(得分:0)

当有多个jar时会发生这种情况。要检查罐子是否已经可用,请转到项目 - &gt; java资源 - &gt; maven依赖项并检查jar是否已经可用。如果它可用,你仍然得到错误。然后在.m2 \ resources文件夹中找到该jar文件的位置,并删除与该jar文件相关的完整文件夹,然后下载更新的版本并将其导入到您的项目中。 :)

有时即使我在pom.xml文件中下载了正确版本的正确jar文件,我也会收到错误。然后我需要从我的pom.xml中删除它并从谷歌下载该jar并将其导入我的项目。确保如果你这样做,那么不要忘记去项目属性 - &gt;部署程序集选项卡 - &gt;单击添加 - &gt; Java Build Path Entries并单击该jar文件并单击apply。

答案 5 :(得分:0)

当类路径上有多个绑定时,选择一个且只能使用一个绑定,并删除其他绑定。

尝试删除明确添加的&#39; org.slf4j&#39;或者&#39; log4j2&#39;。