NoClassDefFoundError в проекте внешней библиотеки для Android - PullRequest
18 голосов
/ 03 ноября 2011

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

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

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

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

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

Ответы [ 7 ]

15 голосов
/ 04 ноября 2011

Это было четко указано в официальном API здесь :

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

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

Библиотека jar должна быть вручную добавлена ​​в зависимый проект приложения *Путь сборки 1012 *, а не только сам путь сборки проекта библиотеки.

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

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

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

7 голосов
/ 02 января 2013

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

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

2 голосов
/ 08 апреля 2013

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

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

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

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

2 голосов
/ 09 октября 2012

Перейти к 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 

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

1 голос
/ 07 октября 2013

У меня была похожая проблема, и ни одно из решений здесь не устранило ее.

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

Мы создаем внутренний JAR-файл, который мы разделяем с бэкэндом и мобильными клиентами с Maven Проблема закончилась тем, что JAR был скомпилирован с Java 1.7. Android 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-файл.

1 голос
/ 06 апреля 2012

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

Кажется, что библиотеки теперь должны находиться в папке libs

0 голосов
/ 11 февраля 2013

Еще одна вещь, на которую следует обратить внимание - это имена библиотечных пакетов.

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

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

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

Мне понадобился почти весь день, чтобы понять это ...

...