使用Maven构建时slf4j版本冲突

时间:2011-03-29 19:39:10

标签: java maven slf4j

我意识到我的一个项目使用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是依赖的一部分,因此它可以单独下载。

3 个答案:

答案 0 :(得分:25)

正如您自己发现的那样,有两个库(Hibernate和其他一些)在两个不同的版本中传递导入SLF4J。不幸的是,旧版本正被maven接收(在这种情况下,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版本并将其从导入它的所有库中排除。

答案 1 :(得分:8)

排除是非常不必要的,可能会产生误导。相反,显式您的项目pom文件中包含所需版本的slf4j-api。就是这样!

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

答案 2 :(得分: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>