Gradle kullanılarak aar kitaplığı için geçişli bağımlılıklar çözülemedi


95

Bir süredir araştırdım ve muhtemelen burada aar ve geçişli bağımlılıklar ile ilgili en popüler cevapları gördüm, ancak bir şekilde bunun nasıl çalışacağını benim için hala net değil.

Yani:

Verilen gradle yapılandırmasına sahip android kitaplığım var:

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'
}

Sonra onu yerel maven deposuna dağıtıyorum gradle install. Dağıtılan kütüphanenin POM dosyası şuna benzer:

<?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>

Ve son olarak, bağımlılık olarak yukarıdaki kitaplığı kullanarak android uygulamamın yapılandırmasını derecelendirin:

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'
}

Ve uygulamayı telefona konuşlandırdıktan sonra NoClassDefFoundErrorandroid kitaplığımın bağımlılıklarını derlemeye ait sınıfları alıyorum .

Android uygulama bağımlılıklarımı şu şekilde inceliyorum 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

Yukarıdaki ağaca göre, tüm geçişli bağımlılıklar algılanmaz. Sorun nerede ve nasıl doğru yapılmalı?


1
gradle dependenciesUygulamanız için çalıştırmanın çıktılarını incelediniz mi?
CommonsWare

providedAnahtar kelimenin orada olmasını istediğinizden gerçekten emin misiniz ? Xav'a göre bu tür bağımlılıklar APK'de paketlenmiyor ve bunların APK'da paketlenmesini isteyeceğinizi düşünüyorum.
CommonsWare

@CommonsWare gradle dependenciesfor android lib: default - Varsayılan eserler için yapılandırma. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3
mkorszun

Bunun gibi yerel AAR dosyalarının işe yaradığının farkında değilim - yerel bir Maven deposuna gitmeleri ve bu şekilde başvurulmaları gerektiğini düşünüyorum. Ama ben gerçekten, birinin "uygulama" olarak adlandırmaya karar verdiği bir kitaplık için değil gradle dependencies, uygulama için çalışmayı kastediyordum .
CommonsWare

@CommonsWare lütfen güncellenmiş soruya bakın. Kütüphaneyi yerel maven deposuna yükledim ama bu yardımcı olmuyor.
mkorszun

Yanıtlar:


88

transitiveAar bağımlılığım için öznitelik ayarlayarak sorunumu çözdüm:

compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
    transitive=true
}

3
@PeterNiederwieser Gradle'ın @aaryapıyı bir .jar dosyası olarak yakalamaya çalışmasına neden olan nedenleri atlamak . Bu yapıyı öldürür.
cwc

4
Benim için işe yaramadı. Bende tam sorun var. 2 kütüphanem var ve biri diğerini kullanıyor. compile project(':LeafPeripheralsContract') { transitive=true }işe yaramadı. Geçişli olduğundan şikayet etti. Ve bir yarattım aarve ona geçişli eklemeye çalıştım. Şikayet etmedi ama diğer aar paketine de dahil etmedi.
tasomaniac

1
Benim için de çalışmadı. Bağımlılıkta da bir sınıflandırıcım var. Sorunun bu olup olmadığını merak ediyorum. Android Studio RC1'i kademeli derleme araçlarıyla kullanma 0.14.4.
lostintranslation

1
Evet, sınıflandırıcılar kullanıyorsanız, geçişli deps işe yaramıyor gibi görünmüyor. Buraya bakın: code.google.com/p/android/issues/…
lostintranslation

2
Hem .jar hem de .aar yapılarınız varsa, @aar'ı kullanmak ve geçişleri dahil etmek için tek çözüm budur.
Jeffrey Blattman

19

"@aar" kullanmamalısınız, "@" kullanmak "Yalnızca yapay gösterim " haline gelirse, "@" kullanmak ve bağımlılık geçişli olmasını istiyorsanız, "geçişli = doğru" eklemelisiniz


2
Bu cevap faydalıdır. Önceki yorumumda bir yazım hatası vardı ve onu sildim. Cevabınız için teşekkürler, iyi günler :).
2016

14

Yerel olarak aar kullanıyorsanız bunu deneyin:

compile(project(:your-library-name)) {
    transitive=true
}

6
Merhaba, benim için çalışmıyor. Volley kütüphanesini dahili olarak kullanan bir kütüphane projesi oluşturdum. Kütüphane projesi kullanılarak oluşturulmuş aar dosyasını uygulamama dahil ettim. "Hata: (8, 26) hatası: com.android.volley paketi mevcut değil" hatası alıyorum. Kütüphane projeme derleme (project (': volley')) {transitive = true}
Manish

2
Hey Manish, Aynı sorunla karşı karşıya, herhangi bir çözüm buldun mu?
Jalpesh

Aynı problemle sıkışıp kaldım
Alex

1
Aar'ı flatDir olarak dahil ediyor musunuz? Öyleyse, sizi şu yoruma yönlendiririm: stackoverflow.com/questions/25698160/…
FloG

5

Benzer bir problem yaşıyordum ve problemi çözme adımlarını paylaşabileceğimi hissettim.

Kendi başınıza yayınlarken geçişli bağımlılıkları kullanamamanın temel fikri aaraslında .pomdosyanın beklenen geçişli bağımlılıklarla oluşturulmuş olmamasıdır .

Kendi özel maven depomda yayınlamak için 'maven-publish'android aarbağımlılığım için eklenti kullanıyordum . Diğer projelerim kendi aarbağımlılığımı eklerken geçişli bağımlılıklar çözülmedi build.gradle. İşte bu yüzden, .pomdosyamı yayınlarken dosyayı değiştirmek için yaptım aar.

Burada dikkat edilmesi gereken önemli bir nokta, geçişli davranışa sahip olmasını istediğiniz bağımlılıkların aşağıdaki gibi apikütüphane projenizin build.gradledosyası kullanılarak içe aktarılması gerektiğidir .

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

Şimdi daha önce de söylediğim gibi, bağımlılığı maven-publishyayınlamak için eklenti kullanıyordum aarve bu nedenle gradle'daki yayınlama görevim aşağıdaki gibi görünüyor.

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
        }
    }
}

Bu yüzden başka bir tane kullandım mavenJava.pom dosyayı özel maven depomda yayınlamak için görev böylece aardosya başka bir modüle bağımlılık olarak eklendiğinde,.pom bilgileri ve geçişli bağımlılığı indirir.

Yanıtı tamamlamak için, bana içe aktarılan build.gradlekendinize ait olan dosyaya bağımlılığı bu şekilde eklemelisiniz aar.

api('com.example.masudias:my_lib:1.0.0@aar') {
    transitive = true
}

4

transitivetüketicinin (ör. uygulama) bir üreticiyi ve tüm üreticinin bağımlılıklarını (ör. kitaplıklar) içerdiği anlamına gelir. Derleme süresini artırır ve bağımlılık sürümleriyle ilgili bazı sorunlar yaratabilir

Varsayılan olarak, Gradle bağımlılığında transitive = true

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

Eğer kullandığınız zaman @artifact notationsahip olduğutransitive = false

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

0

Benim için eksiksiz yayınlama çözümü şuna benziyor:


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 sıra gereklidir ...


-1

Bağımlılığın sonuna @aar eklemek benim için işe yaradı.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.