【问题标题】:Maven Class path error multiple SLF4J bindingsMaven 类路径错误多个 SLF4J 绑定
【发布时间】:2018-12-10 01:18:48
【问题描述】:

我在尝试进行 MAVEN 安装时遇到此错误。我尝试了排除,但不确定在 pom 文件中包含的位置。让我如何以及应该在我的 pom 文件中包含哪些排除标签。我还附上了我的 pom 文件 sn-p where to include the excludes`SLF4J: Class path contains multiple SLF4J bindings.

SLF4J:发现绑定在 [jar:file:/C:/Users/147188/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder .class]

SLF4J:发现绑定在 [jar:file:/C:/Users/147188/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.10.0/log4j-slf4j-impl-2.10.0.jar!/org /slf4j/impl/StaticLoggerBinder.class]

SLF4J:请参阅http://www.slf4j.org/codes.html#multiple_bindings 解释。 SLF4J:实际绑定是类型 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

POM 文件:

<!-- Start of required part to make log4j work -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions> 
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>

    <exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions> 
</dependency>
        <!-- End of required part to make log4j work -->

【问题讨论】:

  • 你解决了吗?

标签: maven log4j maven-2 classpath slf4j


【解决方案1】:

1 次运行

mvn dependency:tree

查看哪个包导入org.slf4j

2 保留一个,排除其他

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

【讨论】:

  • 更具体的可以使用“mvn dependency:tree -Dincludes=:slf4j*”
【解决方案2】:

排除默认日志记录的正确方法,并配置 log4j 进行日志记录。 在 Spring Boot 项目中添加此依赖项(如果尚不存在)

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter</artifactId>
 <exclusions>
     <exclusion>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-logging</artifactId>
     </exclusion>
 </exclusions>
</dependency>

请参考Spring Logging - How To

【讨论】:

  • 唯一对我有帮助的答案。谢谢
【解决方案3】:

该消息表明您正在引入 logback-classic 和 log4j-slf4j-impl,它们都希望成为 SLF4J 绑定的日志框架。如果您不确定哪个依赖项引入了哪些其他依赖项,我发现运行“mvn dependency:tree”以查看正在使用的依赖关系树非常有用。这应该为您提供足够的信息来确定您需要排除哪个日志框架绑定。

正如documentation that the warning points to you 所说,

库或框架等嵌入式组件不应声明对任何 SLF4J 绑定的依赖,而应仅依赖 slf4j-api。当库声明对 SLF4J 绑定的编译时依赖项时,它将该绑定强加给最终用户,从而否定了 SLF4J 的目的。当您遇到一个嵌入式组件声明对任何 SLF4J 绑定的编译时依赖项时,请花时间联系该组件/库的作者,并请他们改正他们的方式。

您非常想从所有依赖项中排除所有实际的日志框架,以便唯一使用的日志框架是您明确添加的那个。我什至经常发现设置一些maven-enforcer-pluginbannedDependencies 规则很有用,以确保在更新我的依赖项时不会意外引入另一个日志框架。在您的 POM 中使用 dependencyManagement 部分也很有帮助,以确保您的所有依赖项都使用相同版本的 slf4j-api。

【讨论】:

    【解决方案4】:

    我遇到了同样的 log4j-slf4j 多重绑定问题。导致此问题的原因有多种(为此问题苦苦挣扎:))。请在下面找到 cmets。

    1. 我使用的是 Spring-Boot 版本 1.4.7,内部配置了 slf4j-1.7.25 版本。以下是 url 链接,您可以在其中找到 Spring-Boot 版本和相应的模块版本。

    https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/

    似乎当你使用“spring-boot-starter”依赖时,SB(Spring-Boot) 会自动下载所有这些依赖模块。在我的项目中,我使用的是 slf4j-1.7.21,它创建了多个 slf4j 版本问题。简而言之,SB 无法确定在运行时使用哪个 slf4j 版本。所以,首先我将我的 slf4j 版本更改为 1.7.25(与 Spring-Boot 版本 1.4.7 兼容)。

    1. 接下来您需要排除正确的模块(在我的情况下排除 log4j-over-slf4j,logback-classic 有效)。您需要在所有 spring-boot-starter-** 模块中添加以下排除项。例如:这里我添加了 spring-boot-starter-data-redis 的排除项。

    希望这能解决问题。

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 2014-05-18
      • 2020-07-07
      • 1970-01-01
      • 2023-03-28
      • 2021-05-23
      • 2012-12-11
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多