Maven类路径错误多个SLF4J绑定

时间:2018-07-01 17:37:57

标签: maven log4j maven-2 classpath slf4j

尝试进行MAVEN INSTALL时出现此错误。我尝试排除,但不确定pom文件中的位置。让我在pom文件中应如何以及应使用哪些排除标签。我还将我的pom文件片段附加在其中,以包括排除项SLF4J:类路径包含多个SLF4J绑定。

  

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

4 个答案:

答案 0 :(得分:2)

1次运行

mvn dependency:tree

查看导入org.slf4j的软件包

2保留一个,排除另一个

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

答案 1 :(得分:0)

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

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

  

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

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

答案 2 :(得分:0)

排除默认日志记录并配置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 :(得分:0)

我遇到了同一个log4j-slf4j多重绑定问题。导致此问题的原因有多种(此问题困扰很多:)。请在下面找到评论。

  1. 我使用的是Spring-Boot版本1.4.7,内部配置了slf4j-1.7.25版本。以下是网址链接,您可以在其中找到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有效)。您需要在所有spring-boot-starter-**模块中添加以下排除项。例如:在这里,我为spring-boot-starter-data-redis添加了排除项。

Maven exclusions for log4j-over-slf4j

希望这可以解决问题。