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.

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

EDIT: Я просто декомпилировал classes.dex в apk, созданный Eclipse с помощью инструмента dexdump, и смог подтвердить, что класс связан с apk. Я нашел класс с правильными дескрипторами классов и экземплярами. С другой стороны, я также декомпилировал версию, сгенерированную Ant, и получил немало различий. Слишком много, чтобы повторить здесь. Предполагается, что сгенерированный файл должен быть одним и тем же при использовании Ant и Eclipse?

Ответ 1

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

Ответ 2

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

  • Измените некоторый идентификатор в одном из макетов xml и сохраните xml (любой макет, который будет в проекте, будет делать).
  • После того, как проект, скомпилированный с помощью вилки, изменит идентификатор и сохранит.

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

Ответ 3

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

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