休眠 3.4 与 slf4j 和 log4j

2022-09-01 23:31:51

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

Maven slf4j 依赖项是:

<dependency>
    <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
    <version>1.5.6</version>
</dependency>

而 log4j 依赖项是:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.15</version>
</dependency>

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

java.lang.NoSuchFieldError: name
    at org.slf4j.impl.Log4jLoggerAdapter.<init>(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.<clinit>(Configuration.java:163)
    ...

我错过了什么?

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

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

编辑2:此博客声称该问题是由带有错误版本的slf4j-api.jar的休眠注释引起的。


答案 1

我没有问题

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.1.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.4.0.GA</version>
    </dependency>

     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.6</version>
    </dependency>
    <!-- concrete Log4J Implementation for SLF4J API-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
    </dependency>

答案 2

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

http://slf4j.org/faq.html#compatibilityhttp://slf4j.org/faq.html#IllegalAccessError


推荐