Hibernate 3.4 с slf4j и log4j - PullRequest
       27

Hibernate 3.4 с slf4j и log4j

23 голосов
/ 22 января 2009

Я пытаюсь обновить 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: Если я удаляю зависимость log4j из моего pom.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.

Ответы [ 6 ]

12 голосов
/ 04 февраля 2009

у меня нет проблем с

    <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>
7 голосов
/ 05 мая 2009

На этот вопрос отвечает FAQ по SLF4J. Пожалуйста, смотрите

http://slf4j.org/faq.html#compatibility а также http://slf4j.org/faq.html#IllegalAccessError

4 голосов
/ 06 июня 2009

Я думаю, вам нужно исключить встроенную зависимость SLF4J из каждой зависимости Hibernate.

Я использую Hibernate с JPA, поэтому моя конфигурация не идентична, но я думаю, что крайне важно явно включить log4j и SLF4J и явно исключить slf4j-api из всех зависимостей org.hibernate:

    <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>
2 голосов
/ 22 января 2009

После проверки версии 1.5.6 POM для slf4j-log4j (а затем slf4j-parent) вы должны использовать log4j-1.2.14. POM slf4j-log4j использует управление зависимостями для наследования соответствующей версии log4j от POM slf4j-родителя.

Однако вам не нужно включать log4j в качестве конкретной зависимости, поскольку она уже является зависимостью от slf4j-log4j. Возможно, именно здесь вы вызвали свою проблему.

0 голосов
/ 02 июня 2012

У меня была такая же проблема с displaytag версии 1.2, включая старый slf4j. Изменение тега отображения для исключения:

<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>

, кажется, решил проблему.

0 голосов
/ 22 января 2009

Поиск Google нашел это:

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

Возможно, вам следует проверить свои версии JAR, чтобы убедиться, что они совместимы.

...