Я получаю NoClassDefFoundError при запуске моего Java-приложения. Что обычно является причиной этого?
Переведено автоматически
Ответ 1
Хотя возможно, что это связано с несоответствием пути к классам во время компиляции и выполнения, это не обязательно верно.
В этом случае важно держать в голове два или три разных исключения:
java.lang.ClassNotFoundException Это исключение указывает на то, что класс не был найден в classpath. Это указывает на то, что мы пытались загрузить определение класса, и класс не существовал в classpath.
java.lang.NoClassDefFoundError Это исключение указывает на то, что JVM искала в своей внутренней структуре данных определения класса определение класса и не нашла его. Это отличается от утверждения, что его не удалось загрузить из classpath. Обычно это указывает на то, что мы ранее пытались загрузить класс из classpath, но по какой-то причине это не удалось - теперь мы пытаемся использовать класс снова (и, следовательно, нам нужно загрузить его, поскольку в прошлый раз это не удалось), но мы даже не собираемся пытаться загрузить его, потому что мы не смогли загрузить его ранее (и обоснованно подозреваем, что у нас снова не получится). Более ранним сбоем могло быть исключение ClassNotFoundException или ExceptionInInitializerError (указывающее на сбой в блоке статической инициализации) или любое количество других проблем. Дело в том, что ошибка NoClassDefFoundError не обязательно связана с путем к классу.
Ответ 2
Это вызвано наличием файла класса, от которого зависит ваш код, и он присутствует во время компиляции, но не найден во время выполнения. Ищите различия во времени сборки и путях к классам во время выполнения.
Ответ 3
Вот код для иллюстрации java.lang.NoClassDefFoundError. Пожалуйста, смотрите Ответ Джареда для подробного объяснения.
NoClassDefFoundErrorDemo.java
publicclassNoClassDefFoundErrorDemo { publicstaticvoidmain(String[] args) { try { // The following line would throw ExceptionInInitializerError SimpleCalculatorcalculator1=newSimpleCalculator(); } catch (Throwable t) { System.out.println(t); } // The following line would cause NoClassDefFoundError SimpleCalculatorcalculator2=newSimpleCalculator(); }
Виртуальная машина Java не может найти конкретный класс во время выполнения, который был доступен во время компиляции.
Если класс присутствовал во время компиляции, но недоступен в java classpath во время выполнения.
Примеры:
Класс не находится в Classpath, нет надежного способа узнать это, но часто вы можете просто просмотреть print System.getproperty ("java.classpath"), и он напечатает classpath оттуда, вы можете, по крайней мере, получить представление о вашем фактическом пути к классу во время выполнения.
Простой пример NoClassDefFoundError - класс принадлежит отсутствующему файлу JAR, или JAR не был добавлен в classpath, или иногда имя jar было кем-то изменено, как в моем случае изменил один из моих коллег tibco.jar в tibco_v3.jar и программа терпит неудачу с java.lang.Нам с NoClassDefFoundError было интересно, что не так.
Просто попробуйте запустить с параметром явно -classpath с тем classpath, который, по вашему мнению, будет работать, и если он работает, то это верный короткий признак того, что кто-то переопределяет java classpath.
Проблема с разрешениями в файле JAR также может вызвать NoClassDefFoundError в Java.
Опечатка в конфигурации XML также может вызвать NoClassDefFoundError в Java.
когда ваш скомпилированный класс, который определен в пакете, не присутствует в том же пакете при загрузке, как в случае с JApplet, он выдает NoClassDefFoundError в Java.
Возможные решения:
Класс недоступен в Java Classpath.
Если вы работаете в среде J2EE, видимость класса среди нескольких загрузчиков классов также может вызвать java.lang.Ошибку NoClassDefFoundError см. В разделе примеры и сценарии для подробного обсуждения.
Проверьте наличие java.lang.ExceptionInInitializerError в вашем файле журнала. Ошибка NoClassDefFoundError из-за сбоя статической инициализации является довольно распространенным явлением.
Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может появиться, если одна из его зависимостей, например, собственная библиотека, может быть недоступна.
Любой запускаемый скрипт переопределяет переменную окружения Classpath.
Возможно, вы запускаете свою программу с помощью команды jar, а класс не был определен в атрибуте ClassPath файла манифеста.