2009-01-22 22 views
23

Estoy intentando actualizar desde Hibernate 3.2 a 3.4, que al parecer utiliza slf4j. Nuestro proyecto actualmente usa log4j. Entonces mi suposición es que debería estar usando la implementación envuelta slf4j-log4j12.Hibernate 3.4 con slf4j y log4j

El Maven slf4j dependencia es:

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

Mientras que la dependencia log4j es:

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

Tanto slf4j-log4j12 y log4j hacen referencia a la última versión (que podría encontrar en el repositorio Maven) . Cuando ejecuto mi aplicación, Hibernate falla en su registro:

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é me falta?

Edición 1: Si quito la dependencia log4j de mi pom.xml me sale el error:

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

Edición 2:This blog afirma que el problema es causado por las anotaciones de hibernación de envío con el mal versión de slf4j-api.jar.

+1

Hibernate 3.4? ¿Esta publicación proviene del futuro? – cherouvim

Respuesta

2

Después de comprobar la versión 1.5.6 POM para slf4j-log4j (y luego slf4j-padre) que debe utilizar log4j-1.2.14. El slf4j-log4j POM utiliza gestión de la dependencia para heredar la versión adecuada de log4j del POM slf4j-matriz.

Usted no debe, sin embargo, la necesidad de incluir log4j como una dependencia específica como ya es una dependencia de slf4j-log4j. Es posible que haya sido donde causó su problema.

+0

Me sale un error diferente (ver arriba) cuando log4j se elimina de mi archivo pom.xml. –

12

no tengo problemas con

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

y

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

Muchas gracias, incluidas las dependencias es muy útil. –

4

creo que es necesario para excluir la incorporada en la dependencia SLF4J de cada una de las dependencias de Hibernate.

utilizo con Hibernate JPA, por lo que mi configuración no es idéntico, pero creo que lo más importante es incluir explícitamente log4j y SLF4J y excluir explícitamente slf4j-api de todas las dependencias 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> 
+1

Este enfoque funcionó para mí, ¡gracias! – seanhodges

0

tuve el mismo problema con la versión 1.2 displaytag incluyendo edad slf4j.Cambio de la displaytag tenga la exclusión:

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

y la adición de las dependencias correctas:

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

parecía solucionar el problema.