Hibernate 3.4与slf4j和log4j

我正在尝试从Hibernate 3.2升级到3.4,这显然使用了slf4j。 我们的项目目前使用log4j。 所以我的假设是我应该使用slf4j-log4j12包装实现。

Maven slf4j依赖是:

 org.slf4j slf4j-log4j12 1.5.6  

而log4j依赖是:

  log4j log4j 1.2.15  

slf4j-log4j12和log4j都引用了最新版本(我可以在Maven存储库中找到)。 当我运行我的应用程序时,Hibernate的日志记录失败:

 java.lang.NoSuchFieldError: name at org.slf4j.impl.Log4jLoggerAdapter.(Log4jLoggerAdapter.java:75) at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:75) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:103) at org.hibernate.cfg.Configuration.(Configuration.java:163) ... 

我错过了什么?

编辑1:如果我从我的pom.xml中删除了log4j依赖项,我收到错误:

 java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory at org.slf4j.LoggerFactory.(LoggerFactory.java:60) at org.hibernate.cfg.Configuration.(Configuration.java:163) ... 

编辑2: 此博客声称问题是由使用错误版本的slf4j-api.jar的hibernate注释引起的。

我没有问题

   org.hibernate hibernate-core 3.3.1.GA   org.hibernate hibernate-annotations 3.4.0.GA  

   org.slf4j slf4j-api 1.5.6    org.slf4j slf4j-log4j12 1.5.6  

SLF4J常见问题解答回答了这个问题。 请参见

http://slf4j.org/faq.html#compatibility和http://slf4j.org/faq.html#IllegalAccessError

我认为你需要从每个Hibernate依赖项中排除内置的SLF4J依赖项。

我使用Hibernate和JPA,所以我的配置不完全相同,但我认为关键是明确包含log4j和SLF4J并从所有org.hibernate依赖项中明确排除slf4j-api:

   log4j log4j 1.2.15 compile   com.sun.jmx jmxri   javax.jms jms   com.sun.jdmk jmxtools     org.hibernate hibernate-annotations 3.4.0.GA   org.slf4j slf4j-api   compile   org.hibernate hibernate-entitymanager 3.4.0.GA   org.slf4j slf4j-api   compile   org.slf4j slf4j-log4j12 1.5.6 runtime  

检查版本1.5.6 POM for slf4j-log4j(然后是slf4j-parent)后,您应该使用log4j-1.2.14。 slf4j-log4j POM使用依赖关系管理从slf4j-parent POMinheritance适当版本的log4j。

但是,您不应该将log4j包含为特定依赖项,因为它已经是slf4j-log4j的依赖项。 这可能是你造成问题的地方。

谷歌搜索发现了这个:

http://marc.info/?l=slf4j-user&m=122218775201271&w=2

也许您应该检查您的JAR版本以确保它们兼容。

我在displaytag 1.2版中遇到了同样的问题,包括旧的slf4j。 更改displaytag以排除:

  displaytag displaytag 1.2   org.slf4j jcl104-over-slf4j    

并添加正确的依赖项:

  org.slf4j slf4j-api 1.5.6    org.slf4j slf4j-log4j12 1.5.6  

似乎解决了这个问题。