2015-12-16 3 views
1

Я новичок в J2EE так нежна ...Hibernate не может сериализовать объект на Wildfly из-за ошибки нагрузки SLF4J модуля с Maven

Я использую Wildfly (JBoss) 8.2.0.Final и У меня проблема с спящим режимом. Каждый раз, когда я пытаюсь десериализации объекта, я получаю сообщение об ошибке из спящего режима:

Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.Slf4jLogger 
from [Module "org.hibernate:main" from local module loader @4253c155 
(finder: local module finder @8b9d578 (roots: C:\dev\wildfly-8.2.0.Final\modules, 
C:\dev\wildfly-8.2.0.Final\modules\system\layers\base))] 

Как я понимаю дикий мир SLF4J, wildfly имеет собственную реализацию и правильная вещь, чтобы сделать, это исключить все ссылки на что-нибудь другое чем org.slf4j из ваших зависимостей и включить slf4j-api в ваши зависимости. Я могу подтвердить, что в моей папке lib есть JAR slf4j-api, но я не знаю, как начать эту отладку. Обратите внимание, что другие аспекты приложения загружаются и регистрируются корректно, только когда я пытаюсь десериализовать что-то, что hibernate пытается выполнить сбой и исключение из этого исключения.

Ниже приведены некоторые выдержки из ПОМ:

<!-- logging --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <scope>provided</scope> 
</dependency> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-ejb-plugin</artifactId> 
    <configuration> 
     <archive> 
      <addMavenDescriptor>false</addMavenDescriptor> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>lib/</classpathPrefix> 
      </manifest> 
      <manifestEntries> 
       <Dependencies>org.slf4j org.apache.xerces services</Dependencies> 
       <Class-Path>xxx-myproject-${project.version}.jar</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

ответ

2

Ток SLF4J, который загружает не соответствие с текущей версией гибернации. Вы пытаетесь заменить существующую зависимость slf4j ниже, либо предоставить конкретную версию в зависимости от maven.

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.12</version> 
</dependency> 
+0

Это странно. Предполагается, что Wildfly имеет встроенную версию (модуль) slf4j-api. В Wildfly 10 он локализован в 'wildfly.10.1.0.Final/modules/system/layers/base/org/slf4j /'. Таким образом, вам не нужно добавлять зависимость с помощью компиляции области, предоставляемой только. Если он явно не исключает модуль в jboss-deployment-structure.xml в каталоге META-INF. – Dherik

0

У меня есть аналогичная проблема, но исправление было очень необычным.

У меня был класс, который был сериализуемым. Внутри класса, я использую Logger:

private Logger LOGGER = LoggerFactory.getLogger(MyClass.class); 

Но это LOGGER не преходящее или статичным. Таким образом, во время выполнения ошибка java.lang.ClassNotFoundException: org.slf4j.impl.Slf4jLogger происходила в нашем классе, ответственном за serialize/unserialize. Поэтому я сделал небольшое изменение:

private static Logger logger = LoggerFactory.getLogger(MyClass.class); 

И проблема не исчезла.