Eclipse Hibernate注解3.4.0.GA和slf4j?

Eclipse Hibernate注解3.4.0.GA和slf4j?,eclipse,hibernate,maven-2,slf4j,Eclipse,Hibernate,Maven 2,Slf4j,我有一个maven项目a,它使用hibernate annotations 3.4.0.GA,它使用slf4j api版本1.5.5(通过pom.xml文件中的依赖关系树进行检查)。此外,项目A将slf4j-log4j12版本1.4.2指定为依赖项 我有另一个maven项目B,它依赖于项目A。在项目B中,我指定了以下依赖项: slf4j-api version 1.6.1, logback-core version 0.9.24 logback-classic version 0.9.24 它

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

我有另一个maven项目B,它依赖于项目A。在项目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依赖项中

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

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

不建议这样做,您应该使用相同版本的slf4j工件。从常见问题解答:

除了极少数理论上的例外, SLF4J版本是向后的 兼容的。这意味着你无法做到 从SLF4J 1.0版升级到任意版本 以后的版本没有问题

然而,尽管SLF4J API非常简单 从客户的角度来看是稳定的, SLF4J绑定,如SLF4J简单或 slf4j-log4j12可能需要特定的 slf4j api的版本<强>混合 slf4j工件的不同版本 可能会有问题,而且非常危险 不鼓励。例如,如果 正在使用slf4j-api-1.5.6.jar,然后 你也应该使用 slf4j-simple-1.5.6.jar,使用 slf4j-simple-1.4.2.jar将无法工作

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

这是需要解决的问题

它可以从命令行使用maven进行良好的构建。但是当我从eclipse启动配置运行项目时,我得到(…)

问题是,您从B和A获得了SLF4J工件(可传递),因此您最终混合了
SLF4J api的
多个版本(1.5.5和1.6.1)和多个绑定(
SLF4J-log4j12
logback classic
)。SLF4J在运行时抱怨后面的问题,但您应该同时修复这两个问题

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

是的,该消息建议将绑定升级到更新的版本。但是,更重要的是,它报告在类路径上有多个
绑定:您需要在log4j和logback之间选择作为日志备份,并提供适当的绑定,但不能同时提供这两个绑定

运行project 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>

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

我遇到了这个问题,但在爬网依赖关系树并修复pom后,我仍然有问题。我的解决方案

mvn clean

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

我确实在依赖hibernate的项目A上运行了mvn dependency:tree。它表明hibernate注释版本3.4.0.GA使用slf4j api版本1.5.5而不是1.6.1。如果我理解正确,依赖模块A的所有项目都应该使用与hibernate-1.5.5相同的版本?对我来说,所有相互依赖的项目都必须使用相同的版本似乎相当脆弱。此外,在hibernate更新到该版本之前,我不能使用slf4j 1.6.1。@tul:是的,所有项目都应该使用相同的版本。不,它们不必使用与Hibernate相同的版本。正如我告诉您的,您可以使用
dependencyManagement
元素控制可传递依赖项中工件的版本,我提供了一个示例。无需等待Hibernate更新他们使用的版本。只要使用
dependencyManagement
元素,就可以了。
mvn clean