NoClassDefFoundError для проекта внешней библиотеки для Android

Я использую eclipse для разработки Google Android.

Я создал проект библиотеки ( [x] Is Library в настройках Android), который включает в себя внешний jar-файл (Referenced Libraries). Этот проект библиотеки упоминается в другом проекте (фактический проект, который будет использовать проект библиотеки). Это можно сделать, добавив проект под Android-настройками.

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

Изменить: jar-файл добавлен в экспортированные записи ( [x] my.jar в Order and Export -Tab из проекта библиотеки)

Есть ли чистый способ заставить это работать?

Solutions Collecting From Web of "NoClassDefFoundError для проекта внешней библиотеки для Android"

В официальном API здесь четко указано:

Проект библиотеки может включать библиотеку JAR

Вы можете разработать проект библиотеки, который сам включает библиотеку JAR, однако вам необходимо вручную отредактировать путь сборки зависимого проекта приложения и добавить путь к файлу JAR

Jar lib должен быть добавлен вручную на путь сборки зависимого проекта приложения , а не только сам путь сборки проекта библиотеки.

Обновление с SDK r17:

Это автоматически обрабатывается ADT сейчас, ознакомьтесь с новой функцией для выпуска ADT 17.0.0:

Добавлена ​​возможность автоматической настройки JAR-зависимостей. Любые файлы .jar в папке / libs добавляются в конфигурацию сборки (подобно тому, как работает система сборки Ant). Кроме того, файлы .jar, необходимые для проектов библиотек, также автоматически добавляются к проектам, которые зависят от этих проектов библиотеки. ( Подробнее )

Для тех, кто следил за шагами (даже проверьте проекты в «Заказ и экспорт») и все еще имеет java.lang.ClassNotFoundException в API 17, последний шаг – проверить, что ваш компилятор не работает с Java 1.7. Если это 1.7, то вы должны изменить его на 1.6 для всех своих проектов. После этого он попросит перестроить все проекты и успешно запустить на моем телефоне 🙂

Чтобы изменить версию java-компиляции в eclipse, она находится в: Свойства проекта> Компилятор Java> Уровень соответствия компилятора: 1.6

Перейти к project properties -> build path-> libraies

Если вы видите ваши файлы в jar, как это

 snmp4j.jar - e:\software\jars 

Его может ваша проблема

Добавьте папку libs в свой проект и скопируйте файл jar в эту папку. Щелкните правой кнопкой мыши файл jar и идите build path -> add to build path . Тогда вы можете увидеть свою банку как

 snmp4j.jar - project_name/libs 

Это сработало для меня.

У меня было два проекта с использованием одной и той же библиотеки: одна работала, другая – с java.lang.NoClassDefFoundError . После того, как мне ничего не помогло, я просмотрел файл project.properties в корневом каталоге моего проекта. Рабочий проект имел линию android.library.reference (последняя строка ниже), сбойной:

 # Project target. target=android-17 android.library.reference.1=../my-library-project 

Я вручную добавил строку, и она начала работать! (Да, я попробовал оба свойства проекта – путь сборки java – проекты и (проект) – путь сборки java – порядок и экспорт – ничего не помогло.)

PS Кстати, в «свойствах проекта» есть вкладка «ссылки на проекты». Не знаю, будет ли это работать.

У меня была небольшая проблема, когда я обновился до ADT17, где мои библиотеки не импортировались должным образом. Оказывается, это потому, что мои библиотеки связывались как с зависимостями из моей папки lib, а не с lib!

Кажется, библиотеки должны быть в папке libs с этого момента

У меня была аналогичная проблема, и не решены решения, установленные здесь.

Краткая версия: JAR был скомпилирован в Java 1.7 и не был найден Dalvik.

Мы строим внутренний JAR, который мы разделяем между бэкэнд и мобильными клиентами с Maven. Проблема заключалась в том, что JAR был скомпилирован с Java 1.7. Androids dalvik поддерживает только Java 1.5 и 1.6. Вот почему все отлично работает в Eclipse, поскольку на данный момент оно не составлено dalvik.

Мы даже указали целевую и исходную версии в плагине компилятора Maven для компиляции с Java 1.6. Это не сработало, потому что на машине для сборки был установлен только JDK 1.7. Небольшая заметка в нижней части страницы Maven дала нам подсказку: Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

Чтобы узнать, есть ли у вас эта проблема, переименуйте свой файл *.jar в *.zip распакуйте его и посмотрите в файле MANIFEST.MF для параметра Build-Jdk: чтобы увидеть, какая Java-версия действительно скомпилировала ваш JAR.

Еще одна вещь, на которую нужно обратить внимание, – это имена пакетов библиотеки.

Если вы используете ADT21, и у вас есть библиотеки с одинаковым именем пакета, во время компиляции будет ошибка, но она все равно будет компилироваться и запускаться в Eclipse, предоставляя APK, который пропускает некоторые классы ресурсов. Следовательно, сбой при запуске приложения.

Если вы скомпилируете его с ANT, вы увидите ошибку компиляции, в которой две или более библиотеки используют одно и то же имя пакета.

Чтобы исправить это, переименуйте проект библиотеки с помощью Android Tools -> Rename Application Package. Тогда все вернется к норме.

Мне потребовался почти целый день, чтобы понять это …