java - example - Hibernate 3.4 con slf4j y log4j
spring mvc example in java (6)
Después de verificar la versión 1.5.6 POM para slf4j-log4j (y luego slf4j-parent) debe usar log4j-1.2.14. El POM slf4j-log4j usa administración de dependencias para heredar la versión apropiada de log4j del POM slf4j-parent.
Sin embargo, no debe incluir log4j como una dependencia específica ya que es una dependencia de slf4j-log4j. Es posible que haya sido donde causó su problema.
Estoy intentando actualizar de Hibernate 3.2 a 3.4, que aparentemente usa slf4j. Nuestro proyecto actualmente usa log4j. Entonces mi suposición es que debería estar usando la implementación envuelta slf4j-log4j12.
La dependencia de Maven slf4j es:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
Si bien la dependencia de log4j es:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
Tanto slf4j-log4j12 como log4j hacen referencia a la última versión (que pude encontrar en el repositorio de 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 estoy perdiendo?
Editar 1: si elimino la dependencia log4j de mi pom.xml, obtengo 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)
...
Editar 2: este blog afirma que el problema se debe a que las anotaciones de hibernación se envían con la versión incorrecta de slf4j-api.jar.
Una búsqueda en Google encontró esto:
http://marc.info/?l=slf4j-user&m=122218775201271&w=2
Tal vez deberías verificar tus versiones JAR para asegurarte de que sean compatibles.
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>
Esta pregunta es respondida por las preguntas frecuentes de SLF4J. Por favor mira
http://slf4j.org/faq.html#compatibility y http://slf4j.org/faq.html#IllegalAccessError
Creo que debe excluir la dependencia SLF4J incorporada de cada una de las dependencias de Hibernate.
Uso Hibernate con JPA, por lo que mi configuración no es idéntica, pero creo que lo más importante es incluir explícitamente log4j y SLF4J y excluir explícitamente slf4j-api de todas las dependencias de 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>
Tuve el mismo problema con la etiqueta display versión 1.2 que incluye el viejo slf4j. Cambiar la etiqueta de visualización para tener 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 agregando 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>
Pareció arreglar el problema.