Gradle для Android AAR В зависимости от AAR, оба в том же удаленном хранилище?
Существует несколько вопросов, касающихся транзитивных зависимостей с файлами AAR в Gradle:
- Android Studio 0.2.3 не может разрешить переходные зависимости aar
- Зависимость библиотеки Android Gradle с зависимостью библиотеки с помощью Nexus
- Аар в хранилище. Внешняя зависимость и NoClassDefFoundError
Я также столкнулся с подобными проблемами, пытаясь установить транзитивные зависимости от файлов AAR в удаленном хранилище. У меня есть приложение A, в зависимости от библиотеки B, которая, в свою очередь, зависит от библиотеки C. Библиотека C находится в репозитории Maven. Библиотека B находится в том же репо с POM, который содержит зависимость от библиотеки C. Приложение A имеет библиотеку B в своих зависимостях. Тем не менее, работает gradle clean assembleDebug
приводит к следующему: "Версия модуля [Библиотека B] зависит от библиотек, но не является самой библиотекой".
Я пытался получить награду за один из этих вопросов, надеясь на ясность, но безуспешно.
Я предполагаю, что есть два возможных источника трудностей, с которыми сталкиваюсь я и те, у кого вышеупомянутый вопрос SO:
Транзитивные зависимости AAR из удаленного хранилища просто нарушаются
Переходные AAR-зависимости от удаленного хранилища работают, но в наших файлах POM есть что-то не так,
build.gradle
файлы, или что-то, что нарушает зависимости
Вопрос: Кто-нибудь знает об артефакте AAR в каком-либо общедоступном хранилище (например, Maven Central), который зависит от другого артефакта AAR, также в том же общедоступном хранилище?
Меня не интересует AAR, который зависит от чего-то в локальном хранилище, например AAR в Maven Central, который зависит от com.android.support:support-v4
, В моем случае, если библиотека B и библиотека C находятся в моем локальном репозитории Maven (~/.m2
) все отлично работает.
По словам Ксав, то, что я делаю, должно работать. Следовательно, я надеюсь, что кто-то может указать мне на рабочий пример, чтобы я мог использовать его, чтобы определить, где остальные из нас могут пойти не так.
ПРИМЕЧАНИЕ: я знаю, что запрос на сторонние ресурсы является верным. В этом случае я не ищу ресурс сам по себе, а в качестве примера рабочей конфигурации, чтобы помочь отладить нерабочую конфигурацию. Если у вас есть другой способ написать ответ, показывающий рабочую конфигурацию, это было бы здорово!
Спасибо!
3 ответа
Похоже, что моя проблема прояснилась с Gradle 1.9 и com.android.tools.build:gradle:0.7.+
, По крайней мере, я больше не могу воспроизвести проблему.
У меня нет общедоступного примера, но у меня есть этот сценарий успешно настроен во внутреннем хранилище Nexus. Вот установка:
App - проект приложения Android LibraryB - проект библиотеки Android picasso - библиотека с открытым исходным кодом от Square (доступно в Maven Central) LibraryA - проект библиотеки Android
Приложение зависит от LibraryB и Picasso LibraryB зависит от LibraryA
Вот POM для LibraryB (скачано с Nexus)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>LibraryB</artifactId>
<version>0.1</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>LibraryA</artifactId>
<version>3.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.picasso</groupId>
<artifactId>picasso</artifactId>
<version>2.1.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Вот build.gradle для библиотеки B
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
apply plugin: 'android-library'
apply plugin: 'maven'
version versionProp
group 'com.example'
repositories {
mavenCentral()
maven {
url(exampleReleaseRepoUrl)
}
}
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
}
release {
runProguard false
proguardFile 'proguard-rules.txt'
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
dependencies {
compile 'com.example:LibraryA:3.0.1'
compile 'com.squareup.picasso:picasso:2.1.1'
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri(exampleReleaseRepoUrl)) {
authentication(userName: nexusUsername, password: nexusPassword)
}
snapshotRepository(url: uri(exampleSnapshotRepoUrl)) {
authentication(userName: nexusUsername, password: nexusPassword)
}
}
}
}
Вот POM для LibraryA (скачано с Nexus)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>LibraryA</artifactId>
<version>3.0.1</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>support-v4</artifactId>
<version>19.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Build.gradle для LibraryA очень похож на тот, что для LibraryB выше.
Артефакты и POM для LibraryA и LibraryB были загружены с помощью следующей команды Gradle
gradle uploadArchives
Build.gradle для приложения выглядит следующим образом
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
maven {
url(exampleReleaseRepoUrl)
}
}
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
}
buildTypes {
release {
runProguard false
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
productFlavors {
defaultFlavor {
proguardFile 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:19.0.0'
compile 'com.android.support:appcompat-v7:19.0.0'
compile 'com.example:LibraryB:0.1'
}
Если вам нужна дополнительная информация, дайте мне знать.
Начиная с Android Studio 0.4.4, использование зависимостей.AAR так же просто, как использование зависимостей.JAR. Просто поместите это в \libs
каталог и ссылка на него в build.gradle
:
compile files('libs/YOUR_LIBRARY_NAME.aar')