Создание проекта Android с помощью ant, имеющего зависимость проекта библиотеки от другого проекта библиотеки
У меня, возможно, это не очень распространенная настройка:
( >= зависимость)
Проект Android > Проект библиотеки Android 1 > Проект библиотеки Android 2
Поэтому у меня есть проект библиотеки Android, который имеет зависимость от другого проекта библиотеки.
Когда я строю проект в Eclipse, все работает отлично, но я не могу заставить свою сборку работать с Ant.
Первый Ant компилирует проект библиотеки Android 2, который генерирует class.jar и помещает этот файл в папку bin.
Затем Ant пытается скомпилировать проект библиотеки Android 1, но затем я получаю ошибки, потому что у него отсутствуют классы из проекта библиотеки Android 2.
Ну, это не так странно, потому что файл jar не включен в папки libs.
Но в project.properties я сделал зависимость от проекта библиотеки 2, поэтому почему Ant не копирует классы .jar в папки libs проекта библиотеки 1?
Ну, я могу подумать о решении использовать задачу Ant для копирования файла в папку libs, но тогда мне нужно изменить файл build.xml, который я не предпочитаю.
** РЕДАКТИРОВАТЬ
Проблема в том, что класс R отсутствует, когда я смотрю в classes.jar, этот java файл не содержит R-класс. Таким образом, мое решение будет неэффективно работать.
Ответы
Ответ 1
Это поведение было вызвано изменением в R17 инструментов построения: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects
Вкратце: файлы R для библиотек больше не упаковываются в classes.jar для этой библиотеки. Однако, поскольку pareent.R для родительской библиотеки (project1 в вашем примере) также содержит ссылки на ресурсы для "дочерней" библиотеки (project2 в вашем примере), вам не нужно ссылаться на child-R в любом случае.
Замените все операторы export2.R-import в project1 с помощью операторов import1.R, и вы должны быть в порядке.
Ответ 2
Для ant для компиляции зависимости add в ant.properties.
например:
android.library.reference.1=../path/to/library
Ответ 3
Это звучит очень хрупкая настройка - у вас могут быть веские причины для этого, но разве вы могли бы отделить зависимость библиотек друг от друга?
Например; выполните шаблон моста, чтобы перевести вызовы между обеими библиотеками, и приложите их к проекту Android. Таким образом, у вас нет кода в любой библиотеке, которая зависит от другой, и единственным проектом, который должен обрабатывать настройку зависимостей, является ваш основной проект.
Одна из основных причин использования библиотеки - сделать код повторно используемым, этот подход гарантирует, что кто-то (вы, коллега, ваш преемник...) можете подключить только одну библиотеку и создать собственную реализацию другой.
Вот еще одна хорошая статья о применении шаблона моста в Java: http://java.dzone.com/articles/design-patterns-bridge
Ответ 4
Ну, проблема в том, что класс R отсутствовал.
Поэтому я удалил зависимость класса R между двумя библиотечными проектами.
Я не знаю, исправлено ли это, но я считаю, что это плохая практика.
Без этой зависимости Ant строит отлично.
Ответ 5
Старый вопрос, но, как и я, другие могут ударить головой об этом...
Официальным ответом является "это не может быть сделано", в частности:
При времени сборки библиотеки объединяются с приложением по одному, начиная с самого низкого приоритета и заканчивая наивысшим. Обратите внимание: библиотека не может сама ссылаться на другую библиотеку и что во время сборки библиотеки не сливаются друг с другом, а затем сливаются с приложением.
(извлечен из официальной документации: "Ссылка на проект библиотеки" ).
Это означает, что все идет, так как нет "чистого" способа сделать это с помощью инструментов (и грязные методы в порядке).
Надеюсь, что это поможет