23

我的依赖树和多个 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。或线程“主”java.lang.NoSuchMethodError 中的 2.0.x 异常: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>

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

4

7 回答 7

32

有几个解决方案:

  • 如果您的类路径中有几个不同版本的slf4j jar ,请确保只包含一个 slf4j jar (可能具有更高版本)。
  • 有时可能无法排除多个 slf4j jar,因为它们可能被其他 jar 在内部使用,这些 jar 在您的类路径上。这些依赖的 jar 可能会引用不同版本的 slf4j jar,这会导致您的应用程序失败。在这种情况下,请确保在使用 SLF4J jars 的其他 jar 之前添加了具​​有更高版本 SLF4j 的 jar。这将确保您的 java 程序将选择最新版本的 SLF4J,这显然是向后兼容的。
于 2013-10-29T11:24:26.540 回答
11

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
    
  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>
    
于 2018-12-19T22:23:18.000 回答
5

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

<exclusions>
   <exclusion>
       <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </exclusion>
</exclusions>
于 2017-01-06T10:34:55.237 回答
2

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

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

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

于 2015-01-21T17:32:35.120 回答
0

当类路径上有多个绑定可用时,请选择一个且仅一个您希望使用的绑定,然后删除其他绑定。

尝试删除显式添加的“org.slf4j”或“log4j2”依赖项。

于 2018-03-21T17:48:07.647 回答
0

我有一个类似的问题,尽管排除了所有依赖项,但没有一个排除项起作用。简单地重新加载所有 gradle 项目对我来说是诀窍。

于 2022-01-11T22:08:13.907 回答
0

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

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

于 2017-09-19T05:48:11.640 回答