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 часа ночи.
Ответы
Ответ 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 улучшить этот процесс?