23

我正在尝试从 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.xml 中删除 log4j 依赖项,则会收到错误消息:

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 的休眠注释引起的。

4

6 回答 6

12

我没有问题

    <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>
于 2009-02-04T01:09:07.087 回答
7

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

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

于 2009-05-05T12:52:16.807 回答
4

I think you need to exclude the built-in SLF4J dependency from each of the Hibernate dependencies.

I use Hibernate with JPA, so my config isn't identical, but I think the crucial thing is to explicitly include log4j and SLF4J and explicitly exclude slf4j-api from all org.hibernate dependencies:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <groupId>com.sun.jmx</groupId>
                <artifactId>jmxri</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.jms</groupId>
                <artifactId>jms</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jdmk</groupId>
                <artifactId>jmxtools</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.4.0.GA</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.4.0.GA</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
        <scope>runtime</scope>
    </dependency>
于 2009-06-06T16:05:46.550 回答
2

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

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

于 2009-01-22T04:41:37.363 回答
0

谷歌搜索发现了这个:

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

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

于 2009-01-22T03:11:24.723 回答
0

我对包含旧 slf4j 的 displaytag 1.2 版也有同样的问题。更改显示标签以排除:

<dependency>
  <groupId>displaytag</groupId>
  <artifactId>displaytag</artifactId>
  <version>1.2</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl104-over-slf4j</artifactId>
    </exclusion>
  </exclusions>
</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>

似乎解决了这个问题。

于 2012-06-01T20:40:46.140 回答