Ошибка java.lang.NoClassDefFoundError на org.springframework.webflow.util.RandomGuid

Извините, мой вопрос глупый, но я не могу на него ответить, как неграмотный 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

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

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

Обновлено: Джаред прав, мои файлы hosts определили 127.0.0.1 как localhost, и теперь он работает очень хорошо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
20 656
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

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

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

Причина в том, что не удалось загрузить класс RandomGUID.

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

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

в случае сбоя статического инициализатора JVM выдаст исключение ExceptionInInitializerError, а не NoClassDefFoundError.

matt b 17.12.2008 22:14

Нет, не совсем. Я 1000 раз видел, как "java.lang.NoClassDefFoundError: Could not initialize class" выбрасывается при сбое инициализатора статического класса. Но да, наверное, это только я :-)

Yoni Roit 18.12.2008 01:34

JVM, скорее всего, вызовет исключение ExceptionInInitializeError в ПЕРВЫЙ раз, когда загрузка класса завершится неудачно, но, скорее всего, вызовет ошибку NoClassDefFoundError при последующих попытках загрузки (достаточно умен, чтобы не повторять попытку загрузки класса, если она не удалась раньше).

Jared 12.01.2009 21:43

У меня раньше были аналогичные проблемы (особенно в старых версиях RedHat Linux), где был размещен файл / etc / hosts (ни одна запись для 127.0.0.1 или 127.0.0.1 не привязана к фактическому имени хоста, а не к localhost.)

Jared 12.01.2009 21:45
Ответ принят как подходящий

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

  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).

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

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

Другие вопросы по теме