我有一个使用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项目中的版本?
答案 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-log4j12
和logback-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
(以防万一其他人犯了我的错误!)