slf4j 版本冲突,而使用 Maven 进行构建

2022-09-02 03:28:23

我意识到我的一个项目使用slf4j 1.5.8,而Hibernate使用slf4j 1.6。在使用Maven构建时,它会下载两个jar,但我想使用了1.5.8的类文件。因此,当我运行该程序时,我得到以下错误:

SLF4J: The requested version 1.5.8 by your slf4j binding is not compatible with [1.6]

在我放pom.xml

<dependencyManagement>    
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
    </dependency>
</dependencyManagement>

1.5.8 是依赖项的一部分,因此可以自行下载。


答案 1

正如您自己发现的那样,有两个库(Hibernate和其他一些库)以两个不同的版本传递导入SLF4J。不幸的是,旧版本正在被maven拾取(在这种情况下,maven应该选择一些依赖关系的规则)。解决方案是在导入旧版 SLF4J 的依赖项中添加 (此处为示例):exclusioncom.example:foo-bar

<dependency>
  <groupId>com.example</groupId>
  <artifactId>foo-bar</artifactId>
  <version>1.2.3</version>
   <exclusions>
     <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
     </exclusion>
   </exclusions>
</dependency>

如果仍然遇到此问题,请发出以下问题:

$ mvn dependency:tree

查找 1.5.8 版本,并将其从所有导入它的库中排除。


答案 2

排除是完全不必要的,也许非常具有误导性。相反,请在项目 pom 文件中显式包含具有所需版本的 slf4j-api。就是这样!

这种方法利用了 Maven 的传递性规则:最接近的依赖关系声明获胜。


推荐