Подтвердить что ты не робот

Eclipse/tomcat: развернуть больше не работает (ClassNotFoundException)

Я запускаю Eclipse Helios Service Release 1, с Tomcat 7.0.12 в Linux Ubuntu Natty Narwhal.

Я был счастливо горячим повторным развертыванием моего webapp, пока он не прекратил работать, по-видимому, без причины. Отображается следующее исключение:

SEVERE: Allocate exception for servlet Index
java.lang.ClassNotFoundException: obliquid.servlet.Index
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
  • В вкладке "Серверы" у меня есть "Tomcat v7.0 Server на localhost [Started, Synchronized]
  • Мой проект появляется как дочерний сервер Tomcat v7.0
  • В свойствах, путь сборки Java, исходный код Я имею исходную папку Project/src
  • В свойствах, сборке веб-развертывания, у меня есть следующие сопоставления:/WebContent → /,/src → /WEB-INF/classes,/test → /build/classes
  • Каталог src содержит сервлет в obliquid/servlet/Index.java
  • Я уже пытался щелкнуть "Рабочий каталог работы с модулем..." и "Опубликовать"
  • Я попытался остановить сервер и запустить сервер с вкладки Eclipse Server

Что еще я должен проверить? Спасибо.

ОБНОВЛЕНИЕ. Несмотря на то, что я работаю с новым проектом, я вернулся, чтобы проверить старый, и таинственно теперь он работает. Думаю, я не смогу найти то, что произошло.

Однако сегодня с новым проектом у меня было 404 ошибки без видимых причин, и я узнал, что щелчок правой кнопкой мыши на сервере Tomcat и выбор "Clean..." могут быть полезны. Возможно, это могло помочь.

Выбор "Чистота..." говорит: "Очистить отбросит все состояние публикации и переиздает с нуля. Вы уверены, что хотите очистить все опубликованные ресурсы?". Выбрав "да", я решил проблему

ОБНОВЛЕНИЕ 2 Это снова произошло в новом проекте. 404 ошибок, на этот раз они не исчезают.

Stop -> Clean... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Clean... -> Start (404)
Stop -> Remove on the application ->  Clean... -> Run As -> Run on Server -> (404)  
Exit Eclipse, Start Eclipse
Start the server -> (404)

ОБНОВЛЕНИЕ 3 Оказалось, что на этот раз я просто не заметил исключения, вызванного классом-слушателем во время запуска. После решения проблемы это сработало. Думаю, я должен прекратить работать в 3 часа ночи.

4b9b3361

Ответ 1

В то время как на Tomcat 6 и Eclipse Ganymede я обнаружил следующую цепочку, чтобы работать как шарм:

1 сервер остановки

2 project → clean

3 сборка проекта (у меня отключена автоматическая сборка)

4 удалить сервер

5 удалить папку с серверами

6 перезапустить Eclipse

7 создайте новый сервер, добавьте проект и запустите:)

занимает некоторое время, но работает как шарм. Моя проблема была раздражающей проблемой начала прослушивания, но это похоже на нечто похожее: свойство at tomcat. Кстати: в настоящее время я также большой поклонник Glassfish.

Ответ 2

Я обнаружил, что эта процедура полезна:

  • Перейдите на вкладку Серверы и остановите использование сервера, если он работает
  • Щелкните правой кнопкой мыши на сервере и выберите Очистить...
  • Щелкните правой кнопкой мыши еще раз и выберите Очистить каталог работы Tomcat...

Надеемся, что ClassNotFoundException должно исчезнуть.

В другой раз у меня возникла проблема с классом, запущенным при запуске сервера, исключение в классе слушателя (ServletContextListener). Когда ServletContextListener создает исключение во время запуска, развертывание приложения прерывается, следовательно, ошибки 404. В этом случае исправление проблемы, вызвавшей исключение, заставило приложение работать снова.

EDIT. Эта более короткая процедура работала для меня большую часть времени, но сегодня она не работала, и мне пришлось следовать расширенной процедуре Mico. Мое предложение, если у вас есть аналогичная проблема, сначала попробуйте эту более короткую процедуру. Если проблема не устранена, попробуйте использовать Mico's.

Ответ 3

Я бы рекомендовал вам снова и снова остановить сервер Tomcat. Горячее развертывание не работает навсегда; есть некоторые проблемы, которые заставят вас перезагрузиться после нескольких повторных развертываний.

Ответ 4

Интересно, когда я вижу ответ с +25, это действительно точный?

Сначала, если вы собираетесь удалить сервер, то в чем смысл его очистки? Он не займет ваше время без необходимости, и ничего полезного вы не получите.

Итак, я скажу, что только 5, 6, 7 шагов должны делать волшебство

5 удалить папку с серверами

6 перезапустить Eclipse

7 создайте новый сервер, добавьте проект и запустите

Ответ 5

Это может быть что-то, что я узнал на confess 2011). Для меня это звучит как проблема загрузчика классов.

Теория позади:

  • Java не только использует тип класса, но и загрузчик классов, который загружал его, чтобы определить тип экземпляра. Это означает, что операция simle может выйти из строя, например.

    ClassA a1 = new a1; ClassA a2 = SomeOtherClass.giveMeInstanceOfA(); a1 = a2;

Этот пример потерпит неудачу, если SomeOtherClass использует другой загрузчик классов, потому что Java скажет, что они не совпадают.

  • Оратор также упомянул, что некоторые серверы используют по умолчанию около 45 различных загрузчиков классов.

Что это означает на практике:

Вы развертываете свой webapp на сервере, все работает нормально. Сервер кэширует классы и все, что ему нужно, чтобы загрузить их где-нибудь. Теперь вы создаете горячие развертыватели, и сервер может загружать новые классы с помощью нового (или другого) загрузчика классов. Это тот момент, когда он начинает становиться опасным, поскольку с этого момента у вас есть два разных класса в памяти, которые должны быть одинаковыми. Простые операции, такие как casts (ClassA a = (ClassA) new ClassA()), не найдены, новые методы в классе не найдены (поскольку сервер занимает кэшированную версию без этого метода),....

Это тот момент, когда я перезапускаю сервер, очищаю рабочий каталог (чтобы избавиться от кешированных версий) и начинаю думать о горячем развертывании как критическом.

Если можно попробовать процедуру Mikkos, и это решает проблему, это объяснение поможет вам понять, почему.

Я знаю, что это не решает вашу проблему, но может дать вам несколько советов, что могло бы произойти.

Ответ 6

У меня появился новый опыт программирования, и я больше не голодаю на комбинации Eclipse + Tomcat. Несколько способов здесь могут помочь вам в необходимости использования этой комбинации:

Прежде всего, не используйте их вместе!

  • Вы можете использовать другие доступные IDE, например. IntellijIdea (это не бесплатно, но стоит инвестировать) обладает тем свойством, что при отладке кода Java вы можете менять код на лету и скомпилировать файлы Java по одному, а затем предлагает, хотите ли вы его получить обновляется на сервере. Никакой перезапуск не требуется почти никогда (конечно, он иногда теряется, но в основном он работает).

  • Использовать автономный сервер tomcat, а не тот, который находится внутри Eclipse/вашей IDE. Этот первый трюк работает только при отладке внешнего сервера, ничего внутри IDE. Появляется второй совет: если вам удастся изменить только содержимое jsp или html, эти файлы можно скопировать в нужное место внутри папки tomcat webapp вручную с помощью команды unix cp или windows copy, и если вам придется разрабатывать файлы в одном и том же врезке долгое время, вы можете скопировать содержимое папки (например, myFolder/*. jsp) столько раз, сколько хотите, и перезагрузка не требуется вообще. Изменения появляются, когда вы касаетесь или редактируете и сохраняете файл web.xml внутри папки webapps, а затем после этого обновляете видимую страницу в браузере. Вероятно, жесткое обновление с помощью CTRL + F5 - лучший способ.

Благодаря @Verdan о его комментарии, иначе я бы не вернулся, чтобы снова ответить.

Ответ 7

Говоря о горячем развертывании Tomcat, вы действительно столкнетесь с различными проблемами, наименьшая из которых - утечка памяти, поэтому вам придется перезапустить приложение. Я бы рекомендовал попробовать JRebel для быстрого изменения "сделать и сохранить любые изменения, а затем обновить браузер и сразу увидеть изменения". Вы можете найти практическую лабораторию JRebel, в которой показано, как использовать ее с Tomcat и Eclipse. http://www.javapassion.com/rebels/jrebel_basics/

Ответ 8

Я столкнулся с одной и той же проблемой - попробовал все вышеперечисленное, Eclipse всегда зависал, когда я пытался запустить сервер, даже после того, как я удалил все конфигурации сервера и создал новый, с недавно загруженным экземпляром tomcat. В любом случае проблема не была решена, пока я не перешел в новое рабочее пространство, не перенаправил проекты и не создал новый сервер. Кажется, как ошибка Eclipse для меня... Так что, если ничего не работает, это путь...

Ответ 9

В настоящее время я борюсь с той же проблемой, но ничто из упомянутого здесь не помогает. Во всяком случае, я узнал, что если я:

  • остановить сервер в eclipse
  • запустите tomcat в другом месте (в моем случае распределение xamp)
  • остановить текущий запуск tomcat
  • start tomcat в eclipse

все работает очень хорошо, конечно, пока я не что-то изменил в коде и не попытаюсь проверить его снова.

Ответ 10

Я смог решить это, отключив природу maven (щелкните правой кнопкой мыши по проекту → maven → отключите maven). Затем снова включите его (щелкните правой кнопкой мыши по проекту → configure → convert to maven project). Я попробовал все другие советы и трюки выше, но это тот, который, наконец, работал.

Ответ 11

Удалите сервер, затем добавьте обратно сервер и добавьте обратно проектные работы. Но для этого нужно много времени, сможет ли Eclipse улучшить этот процесс?