Android Eclipse NoClassDefFoundError для внешних файлов .jar - PullRequest
15 голосов
/ 23 марта 2012

Я столкнулся со странной ошибкой. У меня есть проект Android, который использует внешние библиотеки, в частности:

  • android-support-v4.jar (для поддержки фрагментов в Android 1.6)
  • GoogleAdMobAdsSdk-4.3.1.jar (для рекламы)

Проект работал нормально до тех пор, пока я не обновил некоторые аспекты плагина (не могу вспомнить специфику, поскольку я не обращал на него особого внимания) и после этого всякий раз, когда я пытался использовать какой-либо класс из вышеуказанных файлов .jar (или любой из его подклассов, даже определенных мной), я бы получил java.lang.NoClassDefFoundError. Я не смог найти ответ после долгих поисков, поэтому я действительно в замешательстве.

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

Ответы [ 7 ]

35 голосов
/ 23 марта 2012

Вам нужно прочитать это - Работа с зависимостями в проектах Android .

Эта ссылка также полезна - ClassDefNotFoundError с ADT 17

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

7 голосов
/ 27 мая 2013

Если вы видите NoClassDefFoundError после обновления до ADT 22 * ​​1003 *, попробуйте это в Eclipse:

  • Перейти к Свойства проекта Путь сборки Java Порядок и экспорт вкладка.
  • Установите флажок Частные библиотеки Android .

Android Private Libraries option

7 голосов
/ 29 марта 2013

Android до сих пор не поддерживает Java1.7. Банки, созданные с уровнем соответствия 1.7, нельзя использовать в приложениях Android. Перестройте свой проект Java с уровнем соответствия 5.0 или 6.0 перед экспортом файла jar.

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

1 голос
/ 31 марта 2012

Также предупреждение для тех, кто обновился до r17 со многими зависимостями. У меня был другой ссылочный проект на моем пути сборки, и он все еще не работал после выполнения ВСЕХ указаний по этой проблеме r17 в Интернете.

Через час обнаружил, что мой ссылочный проект использует более старую версию внешнего Jar, чем мой основной проект. При попытке скомпилировать основной проект Eclipse отказывался из-за разницы версий jar, и я никогда не замечал предупреждающее сообщение в консоли.

Решением было скопировать внешний jar-файл более новой версии в каталог libs указанного проекта.

Ух ты - такой убийца производительности .....

0 голосов
/ 14 июня 2014

Если вы используете Eclipse с Maven IDE (m2e), перейдите в «Путь сборки Java», затем «Заказать и экспортировать» и, наконец, проверьте пункт «Зависимости Maven» и опустите его до ДНА списка.Вы должны сделать то же самое со ссылками на проект в той же рабочей области.Каждый раз, когда я настраиваю проект на новом компьютере, это происходит.

0 голосов
/ 17 мая 2013

Я решил это следующим образом: щелкнув правой кнопкой мыши по проекту и выбрав путь сборки.Выберите «Настроить путь сборки» в появившихся вариантах.После этого посмотрите, есть ли ваши библиотеки в папке с библиотеками, затем выберите вкладку «Порядок и экспорт» и там выберите все ваши файлы JAR.Затем выберите ОК и запустите ваш проект.

0 голосов
/ 23 марта 2012

Я тоже столкнулся с этой ошибкой сегодня из-за обновления до Android SDK, r17 .Ссылки, на которые указал @aneal, не обсуждаются, как обращаться с внешними библиотеками времени выполнения (например, импортированными под собственным заголовком, а не импортированной пользовательской библиотекой).

Самый простой способ решить эту проблему - изменить порядок сборки в пути сборки.Просто щелкните правой кнопкой мыши по вашему проекту и выберите Свойства .Отсюда выберите Путь сборки Java .В верхней части экрана выберите вкладку порядок и экспорт и переместите GoogleAdMobAdsSdk-4.3.1.jar выше Android X (заменив x на версию, которую выиспользуете).Затем очистите ваш проект и запустите его.Тебе должно быть хорошо идти!

...