NoClassDefFoundError - Eclipse и Android


193

У меня возникла проблема при попытке запустить приложение для Android, которое до добавления второй внешней библиотеки в путь сборки работало нормально. С тех пор, как я добавил jar Scoreninja, я теперь получаю NoClassDefFoundError при попытке запустить приложение.

Вот сообщение:

02-11 21:45:26.154: ERROR/AndroidRuntime(3654): java.lang.NoClassDefFoundError: com.scoreninja.adapter.ScoreNinjaAdapter

Поскольку все сценарии сборки генерируются инструментами Android (?), Я не уверен, что еще я могу сделать, кроме очистки и перестройки или перезапуска затмения (я уже попробовал все три). Кто-нибудь знает, как я могу это исправить?


1
Как вы добавили файл JAR? Вы добавили, используя путь сборки -> Библиотеки -> Внешние банки ??
Теджа Кантамнени

1
Щелкните правой кнопкой мыши проект> Путь сборки> Добавить внешние архивы ... в соответствии с инструкциями здесь: Scoreninja.appspot.com
Tom R

4
Если вы обновили ADT в последнее время , а затем посмотреть на ответ Джона ниже (и upvote его!) Stackoverflow.com/a/9916751/489852
Атул GOYAL

1
Если у вас возникла эта проблема, прежде чем перейти прямо к ответу Джона, ответ @Till, приведенный ниже, решает ее и для многих людей, включая меня самого.
Карлос П

Вы пробовали мультидекс?
Ашиш Рават

Ответы:


234

У меня была эта проблема после обновления ADT.

Я сохранял все мои JAR-файлы в папке с именем «lib» и добавлял jar-файлы в путь сборки обычным способом Eclipse. Это работало нормально до моего обновления.

После моего обновления я получал NoClassDefFoundError для класса, который, как я мог видеть, был включен в jar (проверяя классы ReferencedLibraries).

Решением было удалить мои файлы jar из пути сборки и переименовать мою папку "lib" в "libs". Это соглашение муравья, и похоже, что новый ADT находит и включает библиотеки в файл .apk. Как только я это сделал, все работало нормально.


1
Большое спасибо! До вчерашнего обновления ADT у меня не было ни папки lib, ни libs, и все работало нормально. После обновления у всех внешних банок была эта проблема. Они были исправлены благодаря вашему ответу. Я должен объединить ваши с Брайаном, чтобы это сработало.
Хун

Спасибо Джон! Я добавлю, что после смены папки на libs мне пришлось перезапустить затмение, чтобы оно заработало.
Michaeldcooney

5
Я столкнулся с той же проблемой после обновления ADT, но я держал мои файлы jar в каталоге вне моего проекта и включал их как пользовательскую библиотеку в мой путь сборки. Решением было удалить пользовательскую библиотеку из моего пути сборки и вместо этого включить файлы jar с помощью «Добавить внешние файлы Jar», а затем экспортировать их, установив флажки на вкладке «Заказ и экспорт».
Трэвис

1
Я ссылался на android-support-v13.jar как на внешнюю библиотеку в C: \ android-sdk-windows \ extras \ android \ compatibility \ v13. Я переместил этот JAR в папку libs проекта и удалил ссылку из Java Build Path -> Libraries. Чистая сборка и я снова собирался.
Snowwire

Здравствуй. я попробовал наш подход, добавив внешние jar-библиотеки в / libs, и теперь получаю эту ошибку: преобразование в формат Dalvik завершилось ошибкой 1
Джонатан

100

Мне не нужно было помещать jar-библиотеку в assets или lib (s), а только поставить галочку для этого jar-файла в Свойствах -> Путь сборки Java -> «Порядок и экспорт» (он был указан ранее, но не выбран). )


Спасибо! Я боролся с этой ошибкой в ​​течение долгого времени, и все, что мне нужно было сделать, это установить чертову коробку для банки на экране «Заказ и экспорт». Самое смешное, что мне нужно было сделать это только для того, чтобы он работал на эмуляторе Nook Tablet. Не было проблем на устройствах или других эмуляторах.
Луис

5
Кто-нибудь знает, почему вы должны сделать и то, и другое, добавить библиотеку, а также установить флажок в Порядок и Экспорт? Есть ли причина, по которой я хотел бы добавить внешний JAR, но не включать его в Order and Export?
Лу Морда

У меня была эта проблема после обновления ADT, и это решило ее для меня.
cdavidyoung

5
Это помогло мне, но только после того, как я сделал Project -> Clean
altumano

Спасибо!! Спас меня. Пришлось сделать чистку и перезагрузить компьютер после установки Eclipse Juno.
Ринардт

68

Добавление внешнего jar-файла в путь сборки просто добавляет jar-файл в ваш пакет, но он не будет доступен во время выполнения.

Чтобы баночка была доступна во время выполнения , вам необходимо:

  • Положите банку под вашу assetsпапку
  • Включите эту копию jar в путь сборки
  • Перейти на вкладку экспорта в том же всплывающем окне
  • Поставьте галочку напротив новой банки

ScoreNinjaAdapter - это чужой код, но я был бы очень удивлен, если бы он содержал такую ​​ошибку, как это обычно используется. Ошибка происходит в точке моего собственного кода.
Том R

Ошибка буквально просто происходит здесь: sna = new ScoreNinjaAdapter (this, SN_APP_ID, SN_APP_KEY);
Том R

Вам нужен importотчет для внешних файлов JAR? Я никогда не использовал их.
Энтони Форлони

Вы пробовали удалить файл .jar из assestsпапки?
Энтони Форлони

Да. В конце концов, я сыт по горло всем этим и просто загрузил исходный код и скопировал исходные файлы в мой проект. Не самое лучшее решение, но оно работает сейчас. Спасибо за вашу помощь.
Том Р

48

У меня было это для MapActivity. Сборки в Eclipse получают NoClassDefFound в отладчике.

Забыли добавить библиотеку в манифест, внутри <Application>...</Application>элемента

<uses-library android:name="com.google.android.maps" />

27

Я изменил порядок включенных проектов (Eclipse / Configure Build Path / Order and Export). Я переместил два моих зависимых проекта в начало списка «Заказ и экспорт». Это решило проблему "NoClassDefFoundError".

Это странно для меня. Я не слышал о важности порядка включения библиотек и проектов. Android + Eclipse это весело :)


Это также решение, упомянутое вторым пользовательским комментарием здесь в bugruport: code.google.com/p/android/issues/detail?id=55304
arberg

15

Я не уверен, связано ли это, или вы все еще ищете ответ, но я наткнулся на эту тему, пытаясь исследовать ту же ошибку (но, возможно, по разным причинам).

Я не мог найти какие-либо решения в Интернете, но ответ на похожую тему заставил меня задуматься и понял, что мне, вероятно, просто нужно перестроить (или очистить) проект.

В Eclipse перейдите в Project => Clean. Выберите свой проект, и Eclipse, похоже, исправит его сам. Для меня это решило проблему.

Надеюсь это поможет.


Да, в Eclipse / ADT / dex /, похоже, есть ошибка, которая в принципе пропускает классы в сборке. Он также может пропустить Applicationкласс, что приводит к другой ошибке.
Тимммм

13

Я столкнулся с той же проблемой. Причина была в том, что библиотека, которую я пытался использовать, была скомпилирована со стандартным JDK 7.

Я перекомпилировал его с -source 1.6 -target 1.6опциями, и он работал нормально.


СПАСИБО ВАМ, БЕЗУМ, БУДУТ !!!!!!!!!!!!!!!!!!! Я был разочарован этой проблемой, и вы решили ее! Немного иронично, что даже самый последний Jelly Bean 4.3 SDK (API 18) все еще не может прочитать 1.7 JAR / классы. И что хуже всего, он вообще не жалуется :(
Хенди Ираван,

У меня была такая же проблема. Хуже всего то, что я подумал об этом варианте, а затем изменил свой -source 1.7 на -source 1.5 (чтобы быть уверенным), и проблема не была решена. Но, после прочтения вашего комментария, я попробовал еще раз с 1.6, а затем он работал как шарм.
Педро Наньес

7

То же самое сработало для меня: Свойства -> Путь сборки Java -> «Порядок и экспорт» Интересно - почему это не делается автоматически? Я думаю, что некоторые настройки отсутствуют. Также это случилось для меня после обновления SDK.


3

Щелкните правой кнопкой мыши папку вашего проекта, найдите Свойства в пути сборки Java и выберите файлы jar, которые вы видите. Это сработало для меня.



2

Я попробовал все из этого поста (и некоторых других постов), и это не сработало для меня, это, безусловно, самое ужасное обновление ADT, которое я когда-либо испытывал, и я никогда не буду обновляться без работающей резервной копии ADT.

Мне удалось решить эту проблему, удалив проект, а затем добавив его снова, используя исходную резервную копию, которая у меня была.


2

У меня была такая же ошибка с ADT22. Решено проверять «Частные библиотеки Android» в свойствах -> Путь сборки Java -> Порядок и экспорт. Если вы используете какие-либо библиотечные проекты, то же самое должно быть сделано и для них.


Это также сработало для меня. Я включил библиотеку, но забыл проверить ее в «Заказ и экспорт». Спасибо!
Jmrodrigg

2

Все существующие ответы не работают для меня, потому что мой случай немного отличается. Мне понадобилось несколько часов, чтобы заставить его работать. Я использую Затмение.

Мой проект Android включает в себя еще один обычный проект Java 1.6, который требует стороннего файла JAR. Хитрость заключается в следующем:

  • включите jar в обычный проект java для его компиляции (только), не проверяйте его на вкладке «Order and Export»
  • также скопируйте этот jar-файл в папку «libs» проекта android, чтобы он был доступен во время выполнения

Надеюсь, что это поможет тем, у кого есть похожие сценарии, как у меня.


1

иногда вам нужно взять весь внешний проект как библиотеку, а не только jar:

Моя проблема была решена путем добавления всего проекта (в моем случае google-play-services_lib) в виде библиотеки, а не только фляги. шаги к нему (из @style answer ):

  1. File-> New-> Другое
  2. Выберите проект Android
  3. Выберите «Создать проект из существующего источника»
  4. Нажмите кнопку «Обзор ...» и перейдите к нужному проекту
  5. Готово (теперь проект панели действий в вашем рабочем пространстве)
  6. Щелкните правой кнопкой мыши по вашему проекту -> Свойства
  7. В разделе Android-> Библиотека нажмите кнопку Добавить.
  8. выберите недавно добавленный проект -> Ok

1

Иногда это происходит из-за того, что в вашем AndroidManifest.xml отсутствует тег jar, от которого вы зависите, с тэгом «util-libary».

Также убедитесь, что он должен быть внутри тега «application».

С Уважением,

Ravi


1

У меня была эта проблема, и она была вызвана тем, что она не «экспортировала» библиотеку. Проблема состояла только в том, что файлы .class для некоторых классов недоступны при упаковке APK. Время компиляции будет работать без экспорта

В моем случае я использовал класс "CusrsorAdapter", а в разделе "JavaBuildPath-> Order and Export" я не проверял поддержку V4 jar. Как только выбранная проблема исчезла.

Чтобы убедиться, что вы получаете ошибку noClassDefFound по вышеуказанной причине, пожалуйста, проверьте ваш logacat, вы увидите неизвестную ошибку суперкласса во время выполнения.



0

Я пробовал разные вещи, и причиной ошибки в моем случае был конфликт между maps.jar и Google Api в Java Build Path-> Libraries. Итак, когда я удалил maps.jar, он работал нормально.

С Уважением,

Вахиб


0

пожалуйста, убедитесь, что ваш jar-файл находится в каталоге libs вашего проекта, так как вы используете более новую версию ADT с затмением.


0

У меня точно такая же проблема ... Чтобы исправить это, я просто удалил свои Android Private Libs в "пути сборки" и нажал "ОК" ... и когда я снова открыл "путь сборки", затмение снова добавило их самостоятельно, а то у меня сработало;) ...


0

я потратил два дня, пытаясь решить эту проблему после обновления ADT. наконец, мне повезло получить этот пост здесь:

https://code.google.com/p/android/issues/detail?id=55304

что привело меня в правильном направлении. когда вы следуете решению - не забудьте заменить библиотеку поддержки Android всех ваших проектов на одну и ту же версию (удалите ее и заново установите в проекты). надеюсь это поможет - удачи


0

Если вы предпочитаете знать, с какими файлами связано обходное решение, вот что я нашел. Просто измените файл .classpath на

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

Замените файл .classpath во всех проектах библиотеки и в основном проекте Android. Файл .classpath находится в корневой папке проекта eclipse. Конечно, не забудьте добавить свои собственные записи пути к классам, если они у вас есть (так что сравните с текущей версией .classpath).

Я полагаю, что это тот же результат, что и при просмотре меню eclipse, как было объяснено выше пользователем componentavt (Eclipse / Configure Build Path / Order and Export).


0

Решение здесь сработало для меня. Это вопрос импорта библиотеки в папку libs, изменения файла build.gradle и очистки с помощью gradlew.


0

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


0

Попробуй это:-

Шаг 1

Добавить все библиотеки для сборки pat в Eclipse (значит сделать все библиотеки ссылками на библиотеки)

Шаг 2

Удалите файл R.java и снова соберите проект. Не волнуйтесь, R.java автоматически воссоздается.

Холод :)


0

Как я понял, ваш проект не показывает ошибок, потому что вы включили Jar. Но Jar не будет использоваться, когда ваш проект будет «экспортирован» на устройство. Попробуй это

Проект -> Недвижимость

Путь сборки Java / порядок и экспорт

[✔] Ваша банка


0

Это случается довольно часто со мной.

Последнее, что я помню, было вызвано переключением Eclipse ADT (специальный выпуск Google) на Android Studio и переключением обратно. Я в основном перепробовал все методы, которые я могу найти в stackoverflow, которые не работали для меня.

В конце концов я снова запустил приложение (не более NoCalssDeffoundError), переключив мою IDE на оригинальный Eclipse (Kepler) с ADT.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.