Я пытаюсь перейти с 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.




Поиск в Google нашел это:
http://marc.info/?l=slf4j-user&m=122218775201271&w=2
Возможно, вам стоит проверить свои версии JAR, чтобы убедиться, что они совместимы.
После проверки POM версии 1.5.6 для slf4j-log4j (а затем slf4j-parent) вы должны использовать log4j-1.2.14. POM slf4j-log4j использует управление зависимостями для наследования соответствующей версии log4j от родительского POM slf4j.
Однако вам не нужно включать log4j как конкретную зависимость, поскольку это уже зависимость slf4j-log4j. Возможно, это было причиной вашей проблемы.
Я получаю другую ошибку (см. Выше), когда log4j удаляется из моего файла pom.xml.
у меня нет проблем с
<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>
Большое спасибо, в том числе зависимости очень полезны.
На этот вопрос отвечает FAQ по SLF4J. Пожалуйста, посмотри
http://slf4j.org/faq.html#compatibility а также http://slf4j.org/faq.html#IllegalAccessError
Я думаю, вам нужно исключить встроенную зависимость 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>
У меня была такая же проблема с displaytag версии 1.2, включая старый slf4j. Изменение displaytag для исключения:
<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>
казалось, что проблема решена.
Спящий режим 3.4? Это сообщение из будущего?