java.lang.NoClassDefFoundError в Eclipse, но не с Ant

У меня довольно странная проблема с некоторыми проектами Android и Eclipse. У меня есть несколько проектов Android, в которых используется большая часть одного и того же кода, и поэтому я перенес большую часть кода в проект библиотеки Android. В течение долгого времени это работало достаточно хорошо для трех приложений. Сегодня я хотел использовать библиотеку и для четвертого приложения, и столкнулся с проблемой. В основном ситуация такова:

  • Проект библиотеки: содержит набор действий, а также некоторые служебные классы
  • Новый проект: создание экземпляра одного из действий из библиотечного проекта в определенной ситуации.

Все это должно быть тривиально, я даже сделал то же самое в трех других приложениях с точно такой же активностью из того же самого библиотечного проекта. В новом проекте я сослался на проект библиотеки в свойствах проекта и добавил действие из проекта библиотеки в AndroidManifest.xml. Eclipse теперь распознает это и позволяет мне ссылаться на активность. Все хорошо.

Приложение работает нормально, пока я не выполню действие, которое запускает действие из проекта библиотеки. Приложение закрывается, и logcat сообщает мне следующее:

FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: no.company.application.base.SomeDetailActivity
    at no.company.someotherapplication.SomeListActivity$4.onClick(SomeListActivity.java:466)
    at android.view.View.performClick(View.java:2538)
    at android.view.View$PerformClick.run(View.java:9152)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3691)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
    at dalvik.system.NativeStart.main(Native Method)

Здесь начинается самое интересное. Я знаю, что проект библиотеки связан с.apk, так как у меня есть некоторый служебный код из этого проекта. Но при компиляции этого точного проекта из Ant, используя команды ant debug а потом ant installdприложения работают нормально, включая запуск активности. Таким образом, точно такая же настройка проекта прекрасно работает с Ant, но не с Eclipse.

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

РЕДАКТИРОВАТЬ: я только что декомпилировал class.dex в apk, созданном Eclipse с помощью инструмента dexdump, и смог подтвердить, что класс связан с apk. Я нашел класс с правильным дескриптором класса и полями экземпляра. С другой стороны, я также декомпилировал версию, сгенерированную Ant, и получил довольно много различий. Слишком много, чтобы повторить здесь. Предполагается, что сгенерированный файл будет одинаковым при использовании Ant и Eclipse?

3 ответа

Я просто столкнулся с этой же проблемой. В моем случае он был правильно настроен для пути сборки Java, но я забыл добавить библиотеку. Перейдите в Свойства -> Android, затем нажмите "Добавить..." в разделе "Библиотека", затем добавьте проект библиотеки. После этого все прошло как положено.

Я решил включить банку в buildpath финального проекта. Путь сборки библиотеки, видимо, был недостаточен.

Это отстой, но, по крайней мере, это работает.

Иногда плагин для Android не очень хорошо генерирует ресурсы, которые вызывают такие проблемы. Попробуйте выполнить следующую простую процедуру:

  1. Измените некоторый идентификатор в одном из макетов XML и сохраните XML (подойдет любой макет в проекте).
  2. После того, как проект скомпилирован плагином, измените id обратно и сохраните.

Если это проблема, то она должна решить ее после компиляции проекта.

Другие вопросы по тегам