web-dev-qa-db-fra.com

Hibernate 3.4 avec slf4j et log4j

J'essaie de passer de Hibernate 3.2 à 3.4, qui utilise apparemment slf4j. Notre projet utilise actuellement log4j. Donc, mon hypothèse est que je devrais utiliser l'implémentation encapsulée slf4j-log4j12.

La dépendance Maven slf4j est:

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

Alors que la dépendance log4j est:

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

Slf4j-log4j12 et log4j font tous deux référence à la dernière version (que j'ai pu trouver dans le référentiel Maven). Lorsque j'exécute mon application, Hibernate ne parvient pas à se connecter:

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

Qu'est-ce que je rate?

Edit 1: Si je supprime la dépendance log4j de mon pom.xml, le message d'erreur suivant s'affiche:

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

Edit 2: Ce blog affirme que le problème est dû au fait que des annotations hibernate sont envoyées avec la mauvaise version de slf4j-api.jar.

23
Steve Kuo

je n'ai aucun problème avec

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

et

     <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>
12
Michael Pralow

La FAQ de SLF4J répond à cette question. S'il te plait regarde 

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

7
Ceki

Je pense que vous devez exclure la dépendance intégrée SLF4J de chacune des dépendances Hibernate. 

J'utilise Hibernate avec JPA, ma configuration n'est donc pas identique, mais je pense qu'il est essentiel d'inclure explicitement log4j et SLF4J et d'exclure explicitement slf4j-api de toutes les dépendances 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>
4
James Shade

Après avoir vérifié la version 1.5.6 POM de slf4j-log4j (puis de slf4j-parent), vous devriez utiliser log4j-1.2.14. Le POM slf4j-log4j utilise la gestion des dépendances pour hériter de la version appropriée de log4j du POM slf4j-parent. 

Vous ne devriez cependant pas avoir besoin d'inclure log4j en tant que dépendance spécifique, car il s'agit déjà d'une dépendance de slf4j-log4j. C'est peut-être là que vous avez causé votre problème. 

2
Michael Rutherfurd

J'ai eu le même problème avec la version 1.2 displaytag, y compris l'ancien slf4j. Changer la displaytag pour avoir l'exclusion:

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

et en ajoutant les dépendances correctes:

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

semblait résoudre le problème.

0
M Smith

Une recherche Google a trouvé ceci:

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

Peut-être devriez-vous vérifier vos versions de JAR pour vous assurer qu'elles sont compatibles.

0
duffymo