Gradle для Android AAR В зависимости от AAR, оба в том же удаленном хранилище?

Существует несколько вопросов, касающихся транзитивных зависимостей с файлами AAR в Gradle:

Я также столкнулся с подобными проблемами, пытаясь установить транзитивные зависимости от файлов AAR в удаленном хранилище. У меня есть приложение A, в зависимости от библиотеки B, которая, в свою очередь, зависит от библиотеки C. Библиотека C находится в репозитории Maven. Библиотека B находится в том же репо с POM, который содержит зависимость от библиотеки C. Приложение A имеет библиотеку B в своих зависимостях. Тем не менее, работает gradle clean assembleDebug приводит к следующему: "Версия модуля [Библиотека B] зависит от библиотек, но не является самой библиотекой".

Я пытался получить награду за один из этих вопросов, надеясь на ясность, но безуспешно.

Я предполагаю, что есть два возможных источника трудностей, с которыми сталкиваюсь я и те, у кого вышеупомянутый вопрос SO:

  1. Транзитивные зависимости AAR из удаленного хранилища просто нарушаются

  2. Переходные 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')
Другие вопросы по тегам