Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven类路径错误-多个SLF4J绑定_Maven_Log4j_Maven 2_Classpath_Slf4j - Fatal编程技术网

Maven类路径错误-多个SLF4J绑定

Maven类路径错误-多个SLF4J绑定,maven,log4j,maven-2,classpath,slf4j,Maven,Log4j,Maven 2,Classpath,Slf4j,我在尝试安装MAVEN时遇到了这个错误。我尝试了排除,但不确定在pom文件中包括哪些内容。让我知道我应该如何以及在pom文件中包含哪些排除标记。我还附加了我的pom文件片段,其中包含排除`SLF4J:Class路径包含多个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/im

我在尝试安装MAVEN时遇到了这个错误。我尝试了排除,但不确定在pom文件中包括哪些内容。让我知道我应该如何以及在pom文件中包含哪些排除标记。我还附加了我的pom文件片段,其中包含排除`SLF4J:Class路径包含多个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:有关详细信息,请参阅 解释。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 -->

org.springframework.boot
SpringBootStarterWeb
org.slf4j
slf4j-log4j12
org.springframework.boot
弹簧靴起动器
org.slf4j
slf4j-log4j12
org.springframework.boot
spring启动程序日志记录
org.springframework.boot
spring-boot-starter-log4j2
org.slf4j
slf4j-log4j12

该消息表示您同时引入了logback classic和log4j-slf4j-impl,这两个版本都希望成为slf4j绑定到的日志框架。如果您不确定哪个依赖项带来了哪些其他依赖项,我发现运行“mvn”查看正在使用的依赖项树非常有用。这将为您提供足够的信息,以确定需要排除哪个日志框架绑定

正如《圣经》所说

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

您非常希望从所有依赖项中排除所有实际的日志框架,因此唯一使用的日志框架就是您显式添加的日志框架。我甚至经常发现,设置一些规则以确保在更新依赖项时不会意外引入另一个日志框架非常有用。在POM中使用部分以确保所有依赖项都使用相同版本的slf4j api也是很有帮助的。

1

mvn dependency:tree
查看哪个包导入org.slf4j

2保留一个,排除另一个

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

org.slf4j
slf4j-log4j12

排除默认日志记录的正确方法,并为日志记录配置log4j。 如果springboot项目中还没有此依赖项,请将其添加到springboot项目中

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

org.springframework.boot

.

我遇到了相同的log4j-slf4j多重绑定问题。导致此问题的原因有多种(为此问题进行了很多努力:))。请查看以下评论

  • 我使用的是SpringBootVersion1.4.7,它内部配置了slf4j-1.7.25版本。下面是url链接,您可以在其中找到Spring启动版本和相应的模块版本
  • 似乎当您使用“SpringBootStarter”依赖项时,SB(SpringBoot)将自动下载所有这些依赖模块。在我的项目中,我使用的是slf4j-1.7.21,它产生了多个slf4j版本问题。简而言之,SB无法确定在运行时使用哪个slf4j版本。因此,首先我将我的slf4j版本更改为1.7.25(与Spring Boot版本1.4.7兼容)

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

  • 希望这能解决问题。

    你解决了吗?这是唯一帮助我的答案。更具体地说,您可以使用“mvn依赖项:tree-Dincludes=:slf4j*”