Ошибка java.lang.NoClassDefFoundError в org.springframework.webflow.util.RandomGuid - PullRequest
7 голосов
/ 17 декабря 2008

Извините, мой вопрос глуп, но я не могу ответить на него, как неграмотный Java. Я запускаю tomcat (5) на CentOS5 (для сервера CAS) и при попытке открыть этот URL http://192.168.1.17:8080/cas-server-webapp-3.3.1/login я получаю эту ошибку:

первая ошибка: java.lang.NoClassDefFoundError: Не удалось инициализировать класс org.springframework.webflow.util.RandomGuid

и ошибка root: org.springframework.web.util.NestedServletException: обработка обработчика не выполнена; вложенным исключением является java.lang.NoClassDefFoundError: не удалось инициализировать класс org.springframework.webflow.util.RandomGuid

$ CLASSPATH пуст, и, похоже, это проблема, но я не знаю, что в нее вставить.

РЕДАКТИРОВАТЬ: Джаред прав, мои файлы хостов определили 127.0.0.1 как localhost, и теперь это работает очень хорошо!

Ответы [ 5 ]

25 голосов
/ 12 января 2009

В этом случае важно сохранить два или три разных исключения в нашей голове:

  1. java.lang.ClassNotFoundException Это исключение означает, что класс не найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, а класс не существовал в пути к классам.

  2. java.lang.NoClassDefFoundError Это исключение указывает на то, что JVM просмотрела в своей внутренней структуре данных определения класса определение класса и не нашла его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это означает, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине это не удалось - теперь мы пытаемся снова, но даже не собираемся пытаться загрузить его, потому что мы не смогли загрузить его ранее. Более ранний сбой мог быть ClassNotFoundException или ExceptionInInitializerError (указывающий на сбой в блоке статической инициализации) или любым другим количеством проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой пути к классам.

При этом другой плакат с ответом указывает, что для RandomGUID требуется вызов InetAddress.getLocalHost (). Во многих операционных системах это вызовет поиск хоста, который будет использовать файл hosts (/etc/hosts в * системах NIX, %WINDOWS%/system32/drivers/etc/HOSTS в системе Windows.)

Я часто сталкивался с подобными ошибками, когда этот файл неправильно определяет адрес локального хоста. 127.0.0.1 должен указывать на 'localhost' (и, вероятно, также localhost.localdomain.). Он должен NOT указывать на фактическое имя хоста машины (хотя по некоторым причинам многие старые установщики RedHat Linux хотели установить это неправильно.)

1 голос
/ 17 декабря 2008

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

В tomcat есть 2 места для размещения jar-файлов, есть глобальная область (которая в 5 похожа на common / lib и немного отличается в tomcat6) и область только для вашего веб-приложения, которое называется webapps / mywebapp / WEB -INF / Lib. Банки для вашего приложения действительно должны быть здесь, но если вы действительно озадачены и не можете найти какой-либо другой способ заставить его работать, они будут работать в глобальном масштабе (если у вас есть только некоторые из них в глобальном, это может также сломайте, так как им может понадобиться класс в другом банке, и если один фрагмент находится в локальном, он не будет работать. Это особенно верно для библиотек Spring, потому что есть несколько отдельных jar, а не только один).

ваш CLASSPATH - это список везде, где jvm ищет классы. Это может включать каталоги файлов классов или файлы jar или zip классов, которые перечислены как каталоги. Tomcat должен загрузить это для вас, правильно используя вышеупомянутые каталоги.

1 голос
/ 17 декабря 2008

Причиной является ошибка загрузки класса RandomGUID.

При взгляде на RandomGUID source большая часть шансов, что его статический инициализатор завершился ошибкой в ​​InetAddress.getLocalHost ().

У вас есть какая-то странная сетевая конфигурация на хосте? Например, нет или странное определение локального хоста в / etc / hosts?

1 голос
/ 17 декабря 2008

В настоящее время переменная окружения $ CLASSPATH не должна использоваться; вместо этого в java-приложении должен быть установлен classpath в командной строке.

Однако в случае использования tomcat и библиотек, используемых в веб-приложениях, вы просто помещаете JAR-файлы (для Spring) в общую папку / lib / установки tomcat.

0 голосов
/ 08 февраля 2012

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

...