Hibernate-annotations 3.4.0.GA和slf4j?

时间:2010-08-23 11:04:11

标签: eclipse hibernate maven-2 slf4j

我有一个使用hibernate-annotations 3.4.0.GA的maven项目A,它使用slf4j-api 1.5.5版(通过pom.xml文件中的依赖树检查)。进一步的项目A将slf4j-log4j12版本1.4.2指定为依赖项。

我有另一个依赖于项目A的maven项目B.在项目B中,我指定了以下依赖项:

slf4j-api version 1.6.1,
logback-core version 0.9.24
logback-classic version 0.9.24

从命令行使用maven构建得很好。但是当我从eclipse启动配置运行项目时,我得到:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/mm/.m2/repository/org/slf4j/slf4j-log4j12/1.4.2/slf4j-log4j12-1.4.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/mm/.m2/repository/ch/qos/logback/logback-classic/0.9.24/logback-classic-0.9.24.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: slf4j-api 1.6.x (or later) is incompatible with this binding.
SLF4J: Your binding is version 1.5.5 or earlier.
SLF4J: Upgrade your binding to version 1.6.x. or 2.0.x

从这条消息中我指出我需要将项目A中的绑定升级到1.6.x,但我不知道它是如何可能的,因为它包含在hibernate依赖项中。

运行项目B时是否可以切换绑定(更新类路径信息),以便使用1.6.1版本而不是hibernate项目中的版本?

2 个答案:

答案 0 :(得分:9)

  

我有一个使用hibernate-annotations 3.4.0.GA的maven项目A,它使用slf4j-api 1.5.5版(通过pom.xml文件中的依赖树检查)。进一步的项目A将slf4j-log4j12版本1.4.2指定为依赖项。

不建议这样做,你应该使用相同版本的slf4j工件。来自FAQ:

  

Are SLF4J versions backward compatible?

     

由于罕见的理论例外,   SLF4J版本是落后的   兼容。这意味着你可以   从SLF4J 1.0升级到任何版本   以后的版本没有问题。

     

然而,虽然SLF4J API非常好   从客户的角度来看,   SLF4J绑定如slf4j-simple或   slf4j-log4j12可能需要特定的   slf4j-api的版本。 <强>混合   不同版本的slf4j工件   可能有问题而且很强烈   气馁。例如,如果你   正在使用slf4j-api-1.5.6.jar   你也应该使用   slf4j-simple-1.5.6.jar,使用   slf4j-simple-1.4.2.jar不起作用。

     

在初始化时,如果是SLF4J   怀疑可能有版本   不匹配问题,它会发出警告   关于上述不匹配。确切地说   版本不匹配的详细信息   检测机制,请参考   本FAQ中的relevant entry

这是需要解决的问题。

  

从命令行使用maven构建得很好。但是当我从eclipse启动配置运行项目时,我得到(...)

问题是你从B 那些来自A(传递)的SLF4J工件,你最终混合 slf4j-api的几个版本 (1.5.5和1.6.1)和几个绑定slf4j-log4j12logback-classic)。 SLF4J在运行时抱怨后来的问题,但你应该解决这两个问题。

  

从这条消息中我指出我需要将项目A中的绑定升级到1.6.x,但我不知道它是如何可能的,因为它包含在hibernate依赖项中。

是的,该消息建议将绑定升级到更新版本。但是,更重要的是,它报告您在类路径上有超过 ONE 绑定:您需要在log4j和logback之间进行选择,作为记录支持并提供适当的绑定,但不是两者都提供。

  

运行项目B时是否可以切换绑定(更新类路径信息),以便使用1.6.1版本而不是hibernate项目中的版本?

要严格回答有关控制传递依赖关系中的版本的问题,可以使用dependencyManagement元素来完成。这是一个例子:

<project>
  ...
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.4.0.GA</version>
    </dependency>
  </dependencies>
  ...
</project>

具有slf4j-api作为依赖关系的工件(如Hibernate EntityManager)将使用版本1.6.1,如下所示:

$ mvn dependency:tree
...
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  \- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  \- javassist:javassist:jar:3.4.GA:compile

但正如我所说,真正的问题是你需要在类路径上只有一个绑定。选择log4j或logback,而不是两者,并提供适当的绑定。

答案 1 :(得分:0)

我遇到了这个问题,但在抓取我的依赖树并修复我的pom后,我仍然遇到问题。我的解决方案?

mvn clean

(以防万一其他人犯了我的错误!)