it-roy-ru.com

eclipse/Tomcat: развертывание больше не работает (ClassNotFoundException)

Я использую Eclipse Helios Service Release 1 с Tomcat 7.0.12 в Linux Ubuntu Natty Narwhal.

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

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)
  • На вкладке Servers у меня есть сервер Tomcat v7.0 на локальном хосте [Запущено, синхронизировано]
  • Мой проект выглядит как дочерний сервер Tomcat v7.0
  • В Свойствах, Путь сборки Java, Источник, я имею Project/src Исходная папка
  • В свойствах сборки веб-развертывания есть следующие сопоставления: / WebContent -> /, / src -> / WEB-INF/classes, / test -> / build/classes
  • Мой каталог src содержит сервлет в obliquid/servlet/Index.Java
  • Я уже пытался нажать на Очистить рабочий каталог модуля ... и Опубликовать
  • Я пытался остановить и запустить сервер из вкладки Eclipse Servers

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

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

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

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

ОБНОВЛЕНИЕ 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 часа ночи.

22
stivlo

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

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

2 проект -> чистый

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

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

5 удалить папку «Серверы»

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

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

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

36
mico

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

  • Нажмите на Servers tab и остановите сервер, если он работает
  • Снова щелкните правой кнопкой мыши на сервере и выберите Очистить ...
  • Снова щелкните правой кнопкой мыши и выберите Очистить рабочий каталог Tomcat ...

Надеемся, что ClassNotFoundException теперь не должно быть.

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

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

12
stivlo

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

2
duffymo

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

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

Поэтому я скажу, что только 5, 6, 7 шагов должны творить чудеса

5 удалить папку «Серверы»

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

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

2
Amol Ramkrishna Patil

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

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

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

    ClassA a1 = новый a1; ClassA a2 = SomeOtherClass.giveMeInstanceOfA (); A1 = a2;

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

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

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

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

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

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

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

1
monty

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

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

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

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

Спасибо @Verdan за его комментарий, иначе я бы не вернулся, чтобы ответить снова.

1
mico

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

  1. остановить сервер в Eclipse
  2. запустить Tomcat в другом месте (в моем случае дистрибутив xamp)
  3. прекратить текущий запуск Tomcat 
  4. запустить Tomcat в Eclipse

все работает просто отлично, конечно, пока я не изменю что-то в коде и не попробую снова это проверить. 

0
vanomart

Я смог решить эту проблему, отключив maven nature (щелкните правой кнопкой мыши на проекте >> maven >> отключите maven nature). Затем включите его снова (щелкните правой кнопкой мыши по проекту >> настроить >> преобразовать в Maven проект). Я перепробовал все остальные советы и рекомендации, но именно этот, наконец, сработал.

0
Bobby King

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

0
Sang Shin

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

0
user871784