使用Maven构建时的slf4j版本冲突?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (76)

我意识到我的一个项目使用slf4j1.5.8,Hibernate使用slf4j1.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是依赖关系的一部分,所以它是自己下载的。

提问于
用户回答回答于

正如自己发现的,有两个库(Hibernate和一些其他库)在两个不同的版本中临时导入SLF4J。不幸的是,旧版本正在被Maven所采用(在这种情况下,maven应该选择一些依赖关系的规则)。解决方案是添加exclusion在导入旧版本SLF4J的依赖项中(com.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版本,并将其排除在导入它的所有库中。

用户回答回答于

排除是非常不必要的,也许也是相当误导人的。相反,明示将slf4j-api包含在您的项目pom文件。就这样!

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

扫码关注云+社区

领取腾讯云代金券