Почему я получаю NoClassDefFoundError в Java? - PullRequest
471 голосов
/ 29 августа 2008

Я получаю NoClassDefFoundError при запуске приложения Java. Какова обычно причина этого?

Ответы [ 21 ]

2 голосов
/ 27 июля 2016

Приведенная ниже техника мне много раз помогла:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

где TheNoDefFoundClass - это класс, который может быть «потерян» из-за предпочтения более старой версии той же библиотеки, которая использовалась вашей программой. Чаще всего это происходит в тех случаях, когда клиентское программное обеспечение развертывается в доминирующем контейнере, оснащенном собственными загрузчиками классов и множеством древних версий наиболее популярных библиотек.

1 голос
/ 27 сентября 2018

NoClassDefFoundError также может происходить, когда инициализатор static пытается загрузить пакет ресурсов, который недоступен во время выполнения, например файл свойств, который уязвимый класс пытается загрузить из каталога META-INF но не там. Если вы не поймаете NoClassDefFoundError, иногда вы не сможете увидеть полную трассировку стека; чтобы преодолеть это, вы можете временно использовать предложение catch для Throwable:

try {
    // Statement(s) that cause the affected class to be loaded
} catch (Throwable t) {
    Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}
1 голос
/ 05 февраля 2018

Я исправил свою проблему, отключив preDexLibraries для всех модулей:

dexOptions {
        preDexLibraries false
        ...
0 голосов
/ 04 апреля 2019

Я получил ошибки NoClassDefFound, когда не экспортировал класс на вкладке «Порядок и экспорт» в пути сборки Java моего проекта. Обязательно поставьте галочку на вкладке «Заказ и экспорт» всех зависимостей, которые вы добавляете в путь сборки проекта. См. Предупреждение Eclipse: XXXXXXXXXXX.jar не будет экспортирован или опубликован. Время выполнения ClassNotFoundExceptions может привести к .

0 голосов
/ 14 октября 2015

Я получил это сообщение после удаления двух файлов из библиотеки SRC, и когда я возвращал их, я продолжал видеть это сообщение об ошибке.

Мое решение было: перезапустите Eclipse. С тех пор я больше не видел это сообщение: -)

0 голосов
/ 01 апреля 2018

Эта ошибка может быть вызвана непроверенными требованиями к версии Java .

В моем случае мне удалось устранить эту ошибку при создании громкого проекта с открытым исходным кодом, переключившись с Java 9 на Java 8 с помощью SDKMAN! .

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

Затем выполните чистую установку, как описано ниже.


При использовании Maven в качестве инструмента сборки иногда полезно - и обычно приятно - чистить 'установить' сборку с отключенным тестированием .

mvn clean install -DskipTests

Теперь, когда все собрано и установлено, вы можете продолжить и запустить тесты.

mvn test
0 голосов
/ 29 ноября 2017

Java не удалось найти класс A во время выполнения. Класс А был в Maven проекте ArtClient из другого рабочего пространства. Поэтому я импортировал ArtClient в свой проект Eclipse. Два моих проекта использовали ArtClient в качестве зависимости. Я изменил ссылку на библиотеку на ссылку на проект для этих (Build Path -> Configure Build Path).

И проблема ушла.

0 голосов
/ 25 октября 2017

Две разные кассовые копии одного и того же проекта

В моем случае проблема заключалась в неспособности Eclipse различать две разные копии одного и того же проекта. У меня один заблокирован на транке (контроль версий SVN), а другой работает в одной ветви одновременно. Я опробовал одно изменение в рабочей копии как тестовый пример JUnit, который включал в себя извлечение частного внутреннего класса в открытый класс, и пока он работал, я открываю другую копию проекта, чтобы посмотреть на некоторые другие часть кода, которая нуждалась в изменениях. В какой-то момент появился NoClassDefFoundError с жалобой на то, что частного внутреннего класса там не было; двойной щелчок в трассировке стека привел меня к исходному файлу в неправильной копии проекта.

Закрытие транковой копии проекта и запуск тестового примера снова избавили от проблемы.

0 голосов
/ 19 июня 2017

Если кто-то приходит сюда из-за ошибки java.lang.NoClassDefFoundError: org/apache/log4j/Logger, в моем случае это было вызвано тем, что я использовал log4j 2 (но я не добавил все файлы, которые идут с ним), а некоторые библиотеки зависимостей использовали log4j 1. Решение заключалось в добавлении моста Log4j 1.x: jar log4j-1.2-api-<version>.jar, который поставляется с log4j 2. Более подробная информация в log4j 2 миграция .

0 голосов
/ 26 апреля 2016

Убедитесь, что это совпадает в module:app и module:lib:

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }
...