Похоже, вам не хватает файла JAR, который содержит зависимость, как упоминалось в этой записи блога за июль 2006 года, написанной Санджив Дживан :
Разница между ClassNotFoundException и NoClassDefFoundError
A ClassNotFoundException
генерируется, когда сообщаемый класс не найден загрузчиком классов.
Обычно это означает, что класс отсутствует в CLASSPATH
.
Это также может означать, что рассматриваемый класс пытается загрузиться из другого класса, который был загружен в родительский элемент ClassLoader
, и, следовательно, класс из дочернего элемента ClassLoader
не отображается.
Это иногда имеет место при работе в более сложных средах, таких как сервер приложений (WebSphere печально известен такими ClassLoader
проблемами).
Люди часто путают java.lang.NoClassDefFoundError
с java.lang.ClassNotFoundException
. Однако есть важное различие.
Например, исключение (ошибка действительно, так как java.lang.NoClassDefFoundError
является подклассом java.lang.Error
) как
java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory
не означает, что класс ActiveMQConnectionFactory отсутствует в CLASSPATH
.
На самом деле, все наоборот.
Это означает, что класс ActiveMQConnectionFactory
был найден ClassLoader
, однако при попытке загрузить класс возникла ошибка при чтении определения класса.
Это обычно происходит, когда у рассматриваемого класса есть статические блоки или члены, которые используют класс, который не найден ClassLoader
.
Таким образом, чтобы найти виновника, просмотрите исходный класс, о котором идет речь (в данном случае ActiveMQConnectionFactory
), и ищите код, используя статические блоки или статические члены .
Если у вас нет доступа к источнику, просто декомпилируйте его, используя JAD .
При проверке кода, скажем, вы нашли строку кода, как показано ниже, убедитесь, что класс SomeClass входит в ваш CLASSPATH
.
private static SomeClass foo = new SomeClass();
Совет. Чтобы узнать, к какому банку относится класс, вы можете воспользоваться веб-сайтом jarFinder . Это позволяет вам указать имя класса с использованием подстановочных знаков, и он ищет класс в своей базе данных jars.
jarhoo позволяет вам делать то же самое, но его больше нельзя использовать.
Если вы хотите определить, к какому jar-классу относится класс, по локальному пути, вы можете использовать утилиту, такую как jarscan . Вы просто указываете класс, который хотите найти, и путь к корневому каталогу, в котором вы хотите начать поиск класса в jar-файлах и zip-файлах.