使用 Maven 构建时 slf4j 版本冲突

问题描述 投票:0回答:3

我意识到我的一个项目使用

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 是依赖项的一部分,因此需要单独下载。

java maven slf4j
3个回答
27
投票

您自己发现,有两个库(Hibernate 和其他库)在两个不同版本中传递导入 SLF4J。不幸的是,maven 正在使用旧版本(在这种情况下,maven 应选择一些依赖项的规则)。解决方案是在导入旧版本 SLF4J 的依赖项中添加

exclusion
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 版本并将其从导入它的所有库中排除。


8
投票

排除是完全没有必要的,而且可能会产生误导。相反,明确地您的项目 pom 文件中包含具有所需版本的 slf4j-api。就是这样!

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


1
投票

您可以通过以下方式排除错误的版本:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate</artifactId>
  <version>3.2.7.ga</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.