Eclipse Hibernate注解3.4.0.GA和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中,我指定了以下依赖项: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 它
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