Ответ 1
Похоже, что моя проблема прояснилась с помощью Gradle 1.9 и com.android.tools.build:gradle:0.7.+
. В лучшем случае я больше не могу воспроизвести проблему.
В отношении транзитивных зависимостей с файлами AAR в Gradle есть несколько вопросов:
Я тоже столкнулся с подобными проблемами, пытаясь настроить транзитивные зависимости от файлов AAR в удаленном репозитории. У меня есть приложение А, в зависимости от библиотеки B, которое, в свою очередь, зависит
на Библиотеке C. Библиотека C находится в репозитории Maven. Библиотека B находится в одном и том же репо, с POM
, который содержит зависимость от Библиотеки C. В приложении А есть библиотека 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
), все работает нормально.
Согласно Xav, то, что я делаю, должно работать. Поэтому я надеюсь, что кто-нибудь может указать мне на рабочий пример, чтобы я мог использовать его, чтобы определить, где все остальные могут ошибаться.
ПРИМЕЧАНИЕ. Я знаю, что запрос ресурсов вне сайта verboten. В этом случае я не ищу ресурс сам по себе, а в качестве примера рабочей конфигурации, чтобы помочь отладить нерабочую конфигурацию. Если у вас есть другой способ написать ответ, показывающий рабочую конфигурацию, это было бы потрясающе!
Спасибо!
Похоже, что моя проблема прояснилась с помощью Gradle 1.9 и com.android.tools.build:gradle:0.7.+
. В лучшем случае я больше не могу воспроизвести проблему.
У меня нет публичного примера, но этот сценарий успешно настроен во внутреннем хранилище Nexus. Вот настройка:
Приложение - Android-приложение LibraryB - проект библиотеки Android picasso - библиотека с открытым исходным кодом с площади (доступна на 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 для LibraryB
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
Конструкция для приложения выглядит так:
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')