2012-05-14 2 views
15

у меня есть, может быть, это не так часто установка:Строительство Android проект с муравьем, имеющий зависимость проекта библиотеки в другой проект библиотеки

(> = зависимость)
Android проект> Android проект библиотеки 1> Проект Android библиотека 2
Итак, у меня есть проект библиотеки Android, который имеет зависимость от другого проекта библиотеки.

Когда я строю проект в Eclipse, все работает отлично, но я не могу заставить свою работу работать с Ant.

Первый Ant компилирует проект библиотеки Android 2, который генерирует class.jar и помещает этот файл в папку bin.
Затем Ant пытается скомпилировать проект библиотеки Android 1, но затем я получаю ошибки becouse ему не хватает классов из библиотеки проекта Android 2.

Ну это не так странно becouse файл банка не входит в LIBS папки. Но в project.properties я сделал зависимость от проекта библиотеки 2, так почему Ant не копирует классы.jar в папки libs проекта библиотеки 1?

Ну, я могу подумать о решении использовать задачу Ant для копирования файла в папку libs, но тогда мне нужно изменить файл build.xml, который я не предпочитаю.

** EDIT

Проблема заключается в том, что класс R отсутствует, когда я смотрю в classes.jar это Java-файл не содержит класс R. Таким образом, мое решение будет неэффективно работать.

+0

Полученная же проблема. Недавно попытался перекомпилировать старый проект с текущими инструментами sdk и поразить эту проблему. Раньше, когда сборка, использующая исходный код, объединялась, это не проблема, а теперь, что компилировать банки и по какой-то причине оставить класс R. Ни один из «ответов» не является реальным ответом. В моем случае у меня есть платная и бесплатная версия приложения и использование рекомендуемого шаблона из двух проектов и общей библиотеки. Я не вижу в этом хорошего шаблона, что проекты верхнего уровня должны управлять всеми зависимостями общей библиотеки. –

ответ

1

Для муравья компилировать add dependency в ant.properties. например:

android.library.reference.1=../path/to/library 
+1

Да, я сделал эту ссылку. Это работает для обычного Android-проекта, но не тогда, когда я делаю ссылку из проекта библиотеки на другой проект библиотеки. – user1051892

+0

Вы добавили ant.properties в свой проект библиотеки? вы также можете попытаться обновить проект библиотеки, запустив '' проект андроидного обновления -l "lib ref" -p .' в вашей корневой папке ref lib – Tarun

+0

Проект udpate для Android не создал ant.properties. Я добавил ant.properties но не изменилось. Я не знаю, читает ли мусор файл, потому что я строю из другой папки (обычный проект Android) – user1051892

1

Это звучит как очень хрупкую настройка - вы можете иметь веские причины для этого, но вы могли бы вместо того, чтобы разъединить зависимость библиотек друг на друг?

Например, Внесите bridge pattern, чтобы перевести вызовы между обеими библиотеками, и приложите их к проекту Android. Таким образом, у вас нет кода в любой библиотеке, которая зависит от другой, и единственным проектом, который должен обрабатывать настройку зависимостей, является ваш основной проект.

Одна из основных причин использования библиотеки - сделать код повторно используемым, этот подход гарантирует, что кто-то (вы, коллега, ваш преемник ...) можете подключить только одну библиотеку и создать собственную реализацию другой.

Вот еще одна хорошая статья о применении шаблона моста в Java: http://java.dzone.com/articles/design-patterns-bridge

1

Ну проблема в том, что класс R отсутствует.
Итак, я удалил зависимость класса R между двумя библиотечными проектами.
Я не знаю, можно ли это исправить, но я думаю, что это плохая практика.

Без этой зависимости Ant строит отлично.

2

Такое поведение было вызвано изменением R17 из строительных инструментов: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

В двух словах: файлы R для библиотек больше не упакованы в classes.jar для этой библиотеки.Однако, поскольку pareent.R для родительской библиотеки (project1 в вашем примере) также содержит ссылки на ресурсы для «дочерней» библиотеки (project2 в вашем примере), вам не нужно ссылаться на child-R в любом случае ,

Замените все import2.R-import в проекте1 с помощью import1.R, и вы должны быть в порядке.

0

Старый вопрос, но как я, другие могут быть стучал головой на это ...

Официальный ответ: «это не может быть сделано», а именно:

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

(извлечено из официальной документации: "Referencing a Library Project").

Это означает, что все идет, так как нет «чистого» способа сделать это с помощью инструментов (и грязные методы в порядке).

Надеюсь, это поможет

Смежные вопросы