Zależności przechodnie nie zostały rozwiązane dla biblioteki aar przy użyciu gradle

94

Zbadałem jakiś czas i prawdopodobnie zobaczyłem tutaj najpopularniejsze odpowiedzi związane z aar i zależnościami przechodnimi, ale jakoś nadal nie jest dla mnie jasne, jak to działa.

Więc:

Mam bibliotekę androida z podaną konfiguracją gradle:

apply plugin: 'android-library'
apply plugin: 'android-maven'

version = "1.0.0"
group = "com.somepackage"

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
    }

    dependencies {
        classpath 'com.github.dcendents:android-maven-plugin:1.0'
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 10
    }
}

repositories {
    maven { url 'http://www.bugsense.com/gradle/' }
}

dependencies {
    provided 'com.google.android.gms:play-services:+'
    provided 'com.android.support:appcompat-v7:+'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.bugsense.trace:bugsense:3.6'
    compile 'commons-net:commons-net:3.3'
}

Następnie wdrażam go do lokalnego repozytorium Maven z gradle install. Plik POM wdrożonej biblioteki wygląda następująco:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sprezzat</groupId>
  <artifactId>app</artifactId>
  <version>1.0.0</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>com.bugsense.trace</groupId>
      <artifactId>bugsense</artifactId>
      <version>3.6</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>3.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

I wreszcie konfiguracja gradle mojej aplikacji na Androida używająca powyższej biblioteki jako zależności:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    mavenLocal()
}

android {
    compileSdkVersion 15
    buildToolsVersion "19.0.2"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }
}

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.somepackage:LIBRARY_NAME:1.0.0@aar'
}

A po wdrożeniu aplikacji na telefon dostaję się NoClassDefFoundErrorna klasy należące do zależności kompilacyjnych mojej biblioteki Android.

Sprawdzanie zależności aplikacji na Androida przy użyciu gradle dependencies:

apk - Classpath packaged with the compiled main classes.
+--- com.google.android.gms:play-services:+ -> 4.3.23
|    \--- com.android.support:support-v4:19.0.1 -> 19.1.0
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- com.somepackage:LIBRARY_NAME:1.0.0

Zgodnie z powyższym drzewem nie są wykrywane wszystkie zależności przechodnie. Gdzie jest problem i jak należy to zrobić poprawnie?

mkorszun
źródło
1
Czy sprawdziłeś wyniki działania gradle dependenciesswojej aplikacji?
CommonsWare
Czy na pewno chcesz providedtam umieścić słowo kluczowe? Według Xav takie zależności nie są pakowane w APK i myślę, że chciałbyś, aby były spakowane w APK.
CommonsWare
@CommonsWare gradle dependenciesfor my android lib: default - Konfiguracja domyślnych artefaktów. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3
mkorszun
Nie zdaję sobie sprawy, że takie lokalne pliki AAR działają - myślę, że muszą trafiać do lokalnego repozytorium Maven i w ten sposób do nich się odwoływać. Ale ja naprawdę miał na myśli działa gradle dependenciesdla aplikacji , a nie do biblioteki, że ktoś postanowił nazwać „app”.
CommonsWare
@CommonsWare, zobacz zaktualizowane pytanie. Zainstalowałem bibliotekę w lokalnym repozytorium Maven, ale to nie pomaga.
mkorszun

Odpowiedzi:

87

Rozwiązałem swój problem, ustawiając transitiveatrybut dla mojej zależności aar:

compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
    transitive=true
}
mkorszun
źródło
3
@PeterNiederwieser Pominięcie @aarprzyczyn, dla których Gradle próbuje pobrać artefakt jako plik .jar. To zabija kompilację.
cwc
4
U mnie to nie zadziałało. Mam dokładny problem. Mam 2 biblioteki i jedna z nich korzysta z drugiej. compile project(':LeafPeripheralsContract') { transitive=true }nie działał. Narzekał na przechodni. Utworzyłem aari próbowałem dodać do niego przechodni. Nie narzekał, ale nie zawierał go również w innym pakiecie aar.
tasomaniac
1
Dla mnie też nie działa. Mam również klasyfikator w zależności. Zastanawiasz się, czy to jest problem. Korzystanie z Android Studio RC1 z narzędziami do budowania Gradle 0.14.4.
Lostintranslation
1
Tak, jeśli używasz klasyfikatorów, wygląda na to, że dep przechodnie nie działają. Zajrzyj tutaj: code.google.com/p/android/issues/…
lostintranslation
2
jeśli masz zarówno artefakty .jar, jak i .aar, jest to jedyne rozwiązanie, w którym można użyć @aar i uwzględnić przejścia.
Jeffrey Blattman
19

nie powinieneś używać "@aar", jeśli użycie "@" zmieni się w " Notację tylko artefakt ", jeśli chcesz użyć "@" i chcesz mieć zależność przechodnią, powinieneś dodać "transitive = true"

user3070402
źródło
2
Ta odpowiedź jest pomocna. W moim poprzednim komentarzu była literówka i usunąłem ten. Dziękuję za odpowiedź, życzę miłego dnia :).
srain
14

Spróbuj tego, jeśli używasz aar lokalnie:

compile(project(:your-library-name)) {
    transitive=true
}
suhas_sm
źródło
6
Cześć, to nie działa dla mnie. Stworzyłem jeden projekt biblioteki, który wewnętrznie korzysta z biblioteki volley. Dołączyłem do mojej aplikacji plik aar utworzony przy użyciu projektu biblioteki. Otrzymuję komunikat „Błąd: (8, 26) błąd: pakiet com.android.volley nie istnieje”. W moim projekcie biblioteki zawarłem volley using compile (project (': volley')) {transitive = true}
Manish
2
Hej Manish, Czy w obliczu tego samego problemu znalazłeś jakieś rozwiązanie?
Jalpesh
Utknąłem z tym samym problemem
Alex,
1
Czy dołączasz aar jako flatDir? Jeśli tak, odsyłam do następującego komentarza: stackoverflow.com/questions/25698160/ ...
FloG
5

Miałem podobny problem i czułem, że mogę podzielić się etapami rozwiązania problemu.

Podstawową ideą niemożności użycia zależności przechodnich podczas publikowania własnych aarjest w rzeczywistości brak .pomwygenerowania pliku z oczekiwanymi zależnościami przechodnimi.

I był przy użyciu 'maven-publish'wtyczki dla mojego android aaruzależnienia, aby opublikować go w moim własnym prywatnym repozytorium maven. Zależności przechodnie nie zostały rozwiązane, gdy moje inne projekty dodawały moją aarzależność do swoich plików build.gradle. Stąd tutaj, co zrobiłem, aby zmodyfikować .pomplik podczas publikowania mojego aar.

Należy tutaj zauważyć, że zależności, które mają być zachowane jako przechodnie, powinny być importowane przy użyciu pliku apiprojektu biblioteki, build.gradlejak poniżej.

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api 'com.android.volley:volley:1.0.0'
    api "com.google.code.gson:gson:$globalGsonVersion"
}

Teraz, jak powiedziałem wcześniej, używałem maven-publishwtyczki do publikowania aarzależności i stąd moje zadanie publikowania w gradle wygląda następująco.

publishing {
    publications {
        mavenAar(MavenPublication) {
            from components.android
        }

        mavenJava(MavenPublication) {
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                // Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.api.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }

    repositories {
        maven {
            // Your repository information goes here
        }
    }
}

W związku z tym użyłem innego mavenJavazadania, aby opublikować .pomplik w moim prywatnym repozytorium maven, aby po aardodaniu pliku jako zależności do innego modułu .pompobierał informacje i pobierał zależność przechodnią.

Aby uzupełnić odpowiedź, w ten sposób należy dodać zależność w build.gradlepliku do własnego aarzaimportowanego do mnie opublikowanego .

api('com.example.masudias:my_lib:1.0.0@aar') {
    transitive = true
}
Reaz Murshed
źródło
3

transitiveoznacza, że ​​konsument (np. aplikacja) obejmuje producenta i wszystkie zależności producenta (np. biblioteki). Wydłuża czas kompilacji i może powodować problemy z wersjami zależności

Domyślnie zależność Gradle ma transitive = true

api ('com.package:library:0.0.1')
//the same
api ('com.package:library:0.0.1') {
    transitive = true
}

Kiedy używasz @artifact notation, matransitive = false

api ('com.package:library:0.0.1@aar')
//the same
api ('com.package:library:0.0.1@aar') {
    transitive = false
}
yoAlex5
źródło
0

Dla mnie kompletne rozwiązanie do publikowania wygląda następująco:


apply plugin: 'com.github.dcendents.android-maven'

group = GROUP
version = VERSION

// you could move it to env variable or property
def publishFlavorless = true
def firstTask = null

android.libraryVariants.all { variant ->

    if (variant.name.toLowerCase().contains("debug")) {
        // Workaround for https://github.com/gradle/gradle/issues/1487
        if (publishFlavorless && firstTask == null) {
            def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
            firstTask = bundleTask
            artifacts {
                archives(firstTask.archivePath) {
                    builtBy firstTask
                    name = project.name
                }
            }
        }
        return
    }

    def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]

    artifacts {
        archives(bundleTask.archivePath) {
            classifier variant.flavorName
            builtBy bundleTask
            name = project.name
        }
    }
}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom.project {
            name POM_NAME
            artifactId POM_ARTIFACT_ID
            // For aar it is equal to 'aar' with jar transitive dependencies won't work
            packaging POM_PACKAGING
            description POM_DESCRIPTION
        }
    }
}

transitive = trueBlok jest wymagane, jak również ...

Sergey Dryganets
źródło
-1

Po prostu dodanie @aar na końcu zależności zadziałało dla mnie.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Merc
źródło