eclipse / tomcat: deploy больше не работает (ClassNotFoundException) - PullRequest
22 голосов
/ 09 мая 2011

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

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

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

Однако сегодня с новым проектом у меня было 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)

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

Ответы [ 10 ]

37 голосов
/ 22 мая 2011

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

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

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

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

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

5 удалить папку Servers

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

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

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

12 голосов
/ 20 мая 2011

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

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

Надеемся, что ClassNotFoundException должносейчас нет.

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

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

2 голосов
/ 07 ноября 2013

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

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

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

5 удалить папку Servers

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

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

2 голосов
/ 09 мая 2011

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

1 голос
/ 23 августа 2012

Я приобрел некоторый новый опыт в программировании и больше не испытываю голода от комбинации 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 голос
/ 26 мая 2011

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

Теория:

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

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

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

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

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

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

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

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

0 голосов
/ 02 июня 2017

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

0 голосов
/ 20 августа 2013

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

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

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

0 голосов
/ 07 мая 2012

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

0 голосов
/ 27 мая 2011

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

...