NoClassDefFoundError для проекта внешней библиотеки для Android
Я использую eclipse для разработки Google Android.
Я создал проект библиотеки ([x] Is Library
в Android-настройках), который включает внешний jar файл (Referenced Libraries). Этот проект библиотеки упоминается в другом проекте (фактический проект, который будет использовать проект библиотеки). Это делается путем добавления проекта под Android-настройками.
исходный компилятор, но если я хочу его выполнить на устройстве, я получаю NoClassDefFoundError для класса внутри jar файла, который включен в проект библиотеки.
Изменить: JAR файл добавлен в экспортированные записи ([x] my.jar
в Order and Export
-Tab из проекта библиотеки)
Есть ли чистый способ заставить это работать?
Ответы
Ответ 1
Это четко указано в offcial API здесь:
Проект библиотеки может включать библиотеку JAR
Вы можете разработать проект библиотеки, который сам включает библиотеку JAR, однако вам нужно вручную отредактировать путь сборки зависимого проекта приложения и добавить путь к файлу JAR
Jar lib должен быть вручную добавлен в путь сборки зависимый проект приложения, а не только сам путь сборки проекта библиотеки.
Обновление с SDK r17:
Это автоматически обрабатывается ADT сейчас, ознакомьтесь с новой функцией для выпуска ADT 17.0.0 здесь:
Добавлена возможность автоматической настройки JAR-зависимостей. Любые файлы .jar в папке /libs добавляются в конфигурацию сборки (подобно тому, как работает система сборки Ant). Кроме того, файлы .jar, необходимые для проектов библиотек, также автоматически добавляются к проектам, которые зависят от этих проектов библиотеки. (подробнее)
Ответ 2
Для тех, кто следил за шагами (даже проверьте проекты в разделе "Заказ и экспорт" ) и все еще имеет java.lang.ClassNotFoundException в API 17, последний шаг - проверить, что ваш компилятор не работает с Java 1.7, Если это 1.7, то вы должны изменить его на 1.6 для всех своих проектов. После этого он попросит перестроить все проекты и успешно запустить на моем телефоне:)
Чтобы изменить версию java-компиляции в eclipse, она находится в: Свойства проектa > Компилятор Java > Уровень соответствия компилятора: 1.6
Ответ 3
Перейдите к 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
Это сработало для меня.
Ответ 4
У меня было два проекта с использованием одной и той же библиотеки: одна работала, другая - с java.lang.NoClassDefFoundError
.
После того, как мне ничего не помогло, я просмотрел файл project.properties
в корневом каталоге моего проекта.
Рабочий проект имел строку android.library.reference
(последняя строка ниже), сбойной:
# Project target.
target=android-17
android.library.reference.1=../my-library-project
Я вручную добавил строку и начал работать!
(Да, я попробовал оба свойства проекта - путь сборки java - проекты и (проект) - путь сборки java - порядок и экспорт - ничего не помогло.)
PS Кстати, "свойства проекта" также имеют вкладку "ссылки на проекты". Не знаю, будет ли это работать.
Ответ 5
У меня была небольшая проблема, когда я обновился до ADT17, где мои библиотеки не импортировались должным образом. Оказывается, это потому, что мои библиотеки были связаны как зависимости от моей папки lib, а не от lib!
Кажется, что библиотеки должны находиться в папке libs с этого момента
Ответ 6
У меня была аналогичная проблема, и не решены решения, установленные здесь.
Краткая версия: 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.
Ответ 7
Еще одна вещь, на которую нужно обратить внимание - это имена пакетов библиотек.
Если вы используете ADT21, и у вас есть библиотеки с одинаковым именем пакета, во время компиляции будет ошибка, но она все равно будет компилироваться и запускаться в Eclipse, предоставляя APK, который пропускает некоторые классы ресурсов. Следовательно, сбой при запуске приложения.
Если вы скомпилируете его с помощью ANT, вы увидите ошибку компиляции, в которой две или более библиотеки используют одно и то же имя пакета.
Чтобы исправить это, переименуйте проект библиотеки с помощью Android Tools → Rename Application Package. Тогда все вернется к нормальной жизни.
Мне потребовался почти целый день, чтобы понять это...