Android Gradle добавляет в проект внешнюю библиотеку и вложенные внешние библиотеки

Как добавить внешнюю библиотеку и вложенные внешние библиотеки в проект Android?


Структура моего проекта (не разрешено изменять)

  • Apps/
    • App1/
      • build.gradle
      • настройки .градле
    • libraries/
      • library1/
        • build.grade
        • настройки .градле
      • library2/
        • build.grade
        • настройки .градле
      • library3/
        • build.grade
        • настройки .градле
      • library4/
        • build.grade
        • настройки .градле

Приложение1

App1/build.gradle

buildscript {
    ...
}

apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':..:libraries:library1')
    compile project(':..:libraries:library2')
    compile project(':..:libraries:library3')
    compile project(':..:libraries:library4')
}

android {
    ...
}

App1 не зависит напрямую от library3 или library4, однако оно будет жаловаться, если я не включу их в зависимости в файле build.gradle и файле settings.gradle. Итак, я включил их только для того, чтобы он не жаловался.

App1/settings.gradle

include ':'
include '..:libraries:library1'
include '..:libraries:library2'
include '..:libraries:library3'
include '..:libraries:library4'

библиотека1

библиотека1/build.gradle

buildscript {
    ...
}

apply plugin: 'android-library'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':..:library3')
    compile project(':..:library4')
}

android {
    ...
}

библиотека1/settings.gradle

include ':'
include '..:library3'
include '..:library4'

библиотека2..4

библиотека2..4/build.gradle

buildscript {
    ...
}

apply plugin: 'android-library'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    ...
}

библиотека2..4/settings.gradle

include ':'

При попытке gradlew clean build на App1 я получаю следующую ошибку:

FAILURE: Build failed with an exception.

* Where:
Build file '/home/user/projects/branches/branch1/Apps/libraries/library1/build.gradle' line: 15

* What went wrong:
A problem occurred evaluating project ':..:library:library1'.
> Project with path ':..:library3' could not be found in project ':..:library:library1'.

Строка 15 — это compile project(':..:library3') в файле library1/build.gradle.

Как добавить внешнюю библиотеку и вложенные внешние библиотеки в проект Android?


person prolink007    schedule 08.01.2014    source источник
comment
Мне любопытно, может ли кто-нибудь, знакомый с настройками DSL / Groovy, придумать фрагмент, который анализирует вложенные settings.gradles. Это особенно полезно для подмодулей. В настоящее время добавление проекта в любом месте приводит к разрыву сборки по всей цепочке.   -  person James Wald    schedule 30.07.2014


Ответы (3)


В файле settings.gradle (App1/settings.gradle) верхнего уровня сделайте что-то подобное для каждой библиотеки.

include ':library1'   
include ':library2'   
include ':library3'   
include ':library4'   

project(':library1').projectDir = new File(rootProject.projectDir, '../libraries/library1')
project(':library2').projectDir = new File(rootProject.projectDir, '../libraries/library2')
project(':library3').projectDir = new File(rootProject.projectDir, '../libraries/library3')
project(':library4').projectDir = new File(rootProject.projectDir, '../libraries/library4')

Удалите другие файлы settings.gradle, они вам не нужны.

то в каждом скрипте сборки нужно использовать только

compile project (':library1')
compile project (':library2')
etc....

как указано выше, просто используйте один файл settings.gradle в корневом проекте (App1).

Затем из папки App1 запустите gradlew clean :library1:build, чтобы убедиться, что библиотека1 строится правильно.

Что касается проблемы с App1, жалующейся на отсутствие библиотек 3 и 4, вы уверены, что у вас нет кода в приложении, непосредственно ссылающегося на эти библиотеки, либо это, либо библиотеки не найдены при компиляции library1. Соберите каждую библиотеку отдельно, чтобы убедиться, что все они собраны правильно.

person Phil H    schedule 09.01.2014
comment
Я строил каждый по отдельности, и все они строились нормально. По-прежнему не удается заставить ваше предложение работать. Я продолжаю получать сообщение об ошибке, что Evaluation project 'library2' using empty build file. - person prolink007; 09.01.2014
comment
можете ли вы подтвердить правильность путей для определения проекта. Также не уверен, что отсутствует «:» в «библиотеке2»? - person Phil H; 10.01.2014
comment
Да, они правы. Проверено и перепроверено несколько раз. Также сделал копирование и вставку, чтобы убедиться. Тем не менее, я на самом деле пытаюсь использовать другой метод для решения своей проблемы, и до сих пор у меня с этим большой успех. Я опубликую свои результаты, как только я подтвержу, что это работает полностью. - person prolink007; 10.01.2014
comment
Мне пришлось использовать фигурные скобки, чтобы заставить это работать, то есть compile project (':library1'), а не compile project ':library1' - person Tim Malseed; 17.11.2015
comment
Обновил ответ, спасибо @tmalseed за предупреждение. - person Phil H; 17.11.2015

Один вопрос. Вам нужно это дерево зависимостей?

--- App
   |--- Library 2
   |--- Library 1
       |--- Library 3
       |--- Library 4

Если да, вашему приложению не нужно импортировать библиотеки 3 и 4. Эти зависимости доступны в библиотеке 1.

О файлах settings.gradle. Почему по одному в каждом модуле? Этот файл используется только в корневом проекте (например, в рабочей области Eclipse) для ссылки на ваши модули (приложение, библиотека 1, библиотека 2 и т. д.).

Это поможет вам?

person Luis E. Fernandez    schedule 09.01.2014

Я делаю это для относительных путей:

include '..:ambilWarna'
include '..:excel'
include '..:pdfjet'
include '..:commons'
include '..:volley'


include  ':odb2'
include  ':azure'

include ':carBase'
include ':fuelTrackerLib'
include ':comsourcecastlelogbook'
person stefan    schedule 16.10.2015