2009-11-06 3 views
4

У меня есть приложение Java (6), которое использует Hibernate (V3.3.2) для чтения данных из HSQLDB, которые я собираю и отлаживаю/запускаю с помощью Eclipse (V3.5.1) и он отлично работает.Hibernate in Servlet вызываетNoClassDefFoundError: org/slf4j/LoggerFactory

Затем я создал веб-приложение GWT (V1.7) сервлета, скопировал в него свои классы спящего режима и добавил те же зависимости от пользовательских библиотек. Однако, когда я запустить сервлет и попытаться получить доступ к URL, который вызывающее моему код я получаю это:

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 
    at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:152) 
    at xxx.daoimpl.DAOSession.initialise(DAOSession.java:40) 

где DAOSession.java:40 является:

AnnotationConfiguration config = new AnnotationConfiguration(); 

погуглить эту ошибку говорит мне не хватает SLF4J-api.jar из пути к классам, однако, если я смотрю в командной строке для свойств отладки я могу увидеть эту баночку там:

C:\java\jsedk_6\jre\bin\javaw.exe 
-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:54541 
-Xmx512m -Dfile.encoding=Cp1252 
-classpath 
    D:\dev\workspace\xxx\src; 
    D:\dev\workspace\xxx\resources; 
    D:\dev\workspace\xxx\war\WEB-INF\classes; 
    C:\java\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.win32_1.7.1.v200909221731\gwt-windows-1.7.1\gwt-user.jar; 
    C:\java\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.win32_1.7.1.v200909221731\gwt-windows-1.7.1\gwt-dev-windows.jar; 
    C:\java\hibernate-annotations-3.4.0.GA\hibernate-annotations.jar; 
    C:\java\hibernate-annotations-3.4.0.GA\lib\ejb3-persistence.jar; 
    C:\java\hibernate-annotations-3.4.0.GA\lib\hibernate-commons-annotations.jar; 
    C:\java\hibernate-distribution-3.3.2.GA\hibernate3.jar; 
    C:\java\hibernate-distribution-3.3.2.GA\lib\required\antlr-2.7.6.jar; 
    C:\java\hibernate-distribution-3.3.2.GA\lib\required\commons-collections-3.1.jar; 
    C:\java\hibernate-distribution-3.3.2.GA\lib\required\dom4j-1.6.1.jar; 
    C:\java\hibernate-distribution-3.3.2.GA\lib\required\javassist-3.9.0.GA.jar; 
    C:\java\hibernate-distribution-3.3.2.GA\lib\required\jta-1.1.jar; 
    C:\java\hibernate-validator-4.0.1.GA\hibernate-validator-4.0.1.GA.jar; 
    C:\java\hibernate-validator-4.0.1.GA\lib\validation-api-1.0.0.GA.jar; 
    C:\java\hibernate-validator-4.0.1.GA\lib\log4j-1.2.14.jar; 
    C:\java\hsqldb\lib\hsqldb.jar; 
    C:\java\restlet-jse-2.0m5\lib\org.restlet.jar; 
    C:\java\restlet-jee-2.0m5\lib\org.restlet.ext.servlet.jar; 
    C:\java\restlet-jse-2.0m5\lib\org.restlet.ext.xml.jar; 
    C:\java\slf4j-1.5.8\slf4j-api-1.5.8.jar; 
    C:\java\slf4j-1.5.8\slf4j-log4j12-1.5.8.jar 
    com.google.gwt.dev.HostedMode 
    ... 

Если я открыть банку я могу увидеть класс LoggerFactory там.

Любая идея, почему он не найден загрузчиком классов?

Редактировать 1: Если вы попытаетесь получить доступ к org.slf4j.LoggerFactory из моего кода, Eclipse скомпилирует его в порядке, но я получаю ту же ошибку во время выполнения.

Редактировать 2: Если я добавлю тестовый класс с основным, который вызывает тот же код и запускает его, он работает. Таким образом, эта проблема с classpath кажется специфичной для Servlet.

спасибо, джон

ответ

6

Кажется, что копирование двух контейнеров slf4j в подпрограмму войны/WEB-INF/lib было исправлено. Я не совсем уверен, почему мне нужно делать это для этих двух банок, а не для всех других баров Hibernate, Restlet и т.д., которые также используют проект, хотя я предполагаю, что для согласованности я все равно это сделаю - я думаю, это сделает развертывание проще.

Если кто-то может дать какое-то объяснение, почему это сработало и почему именно мне нужно это сделать, я выберу его как «правильный» ответ, иначе я его выберу.

+0

Я хотел бы посмотреть, как выглядит ваш классный путь. Я подозреваю, что встроенный Tomcat GWT не нашел банки, потому что они были ниже (после) в пути к классам или потому, что сервер-реселлер вмешивался, но когда вы помещали их в web-inf/lib, они теперь были выше (после) или переопределить материал для перезапуска. –

+0

У меня была точно такая же проблема, и я сделал это, и это сработало. Спасибо! – Ricket

+0

У меня была такая же проблема, и это сработало, у кого-то есть объяснение? –

3

Можете ли вы подтвердить, что у вас есть по крайней мере два slf4j.jar файлы в пути к классам, в SLF4J-api.jar и ровно одной реализации, такие как SLF4J-jdk14.jar?

В пути к классам не должно быть нескольких sflj4-реализаций.

+0

Путь к классам, перечисленных выше, имеет следующие SLF4J банки: C: \ Java \ SLF4J-1.5.8 \ SLF4J-апи-1.5.8.jar C: \ Java \ SLF4J-1.5.8 \ SLF4J-log4j12- 1.5.8.jar Я предполагаю, что последняя является реализацией log4j. –

+0

Подключитесь к запущенному процессу с помощью VisualVM и проверьте реальный путь к классам. Возможно, GWT добавляет дополнительные элементы pathpath в webapp и может быть дополнительный log4j.jar или что-то в этом роде. – mhaller

1

У вас проблема с зависимостью от выполнения, поэтому все компилируется нормально, но зависимость находится в ваших банках. Вам нужно посетить сайт Hibernate и посмотреть совместимость matrix и убедиться, что вы правильно настроены, а затем проверьте зависимости аннотаций и ядра. У вас ловушки log4J выглядят прекрасно, так что это определенно какая-то причуда.

Если это работает в Eclipse, то логически это определенно определенная разница между 2 циклами работы (затмение и не-затмение), если матрица отлично проверяет, а затем посмотрите, можете ли вы отбросить общие черты в 2, а затем разобраться в различиях - ваш ответ должен быть там.

1

У меня была аналогичная проблема, за исключением того, что я использовал Tomcat, а ошибка NoClassDefFound была в juli logger. Я исправил это, удалив зависимости Tomcat из моего пути к классам при работе в режиме размещения, потому что режим хостинга встраивал сервер Tomcat, который противоречил друг другу. Поэтому я бы посмотрел, что произойдет, если вы удалите некоторые или все баны-рестарта из вашего класса, чтобы увидеть, конфликтуют ли они.