Dependensi transitif tidak diselesaikan untuk perpustakaan aar menggunakan gradle


95

Saya telah menyelidiki beberapa saat dan mungkin melihat jawaban paling populer di sini terkait dengan aar dan dependensi transitif tetapi entah bagaimana masih belum jelas bagi saya bagaimana membuatnya berfungsi.

Begitu:

Saya memiliki perpustakaan android dengan konfigurasi gradle yang diberikan:

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

Kemudian saya menerapkannya ke repo maven lokal dengan gradle install. File POM dari pustaka yang diterapkan terlihat seperti ini:

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

Dan akhirnya konfigurasi gradle aplikasi android saya menggunakan pustaka di atas sebagai dependensi:

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

Dan setelah menerapkan aplikasi di ponsel, saya mendapatkan NoClassDefFoundErrorkelas yang termasuk dalam dependensi kompilasi pustaka android saya.

Memeriksa dependensi aplikasi android saya menggunakan 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

Menurut pohon di atas, semua dependensi transitif tidak terdeteksi. Di mana masalahnya dan bagaimana cara melakukannya dengan benar?


1
Sudahkah Anda memeriksa keluaran dari menjalankan gradle dependenciesaplikasi Anda?
CommonsWare

Dan apakah Anda benar-benar yakin menginginkan providedkata kunci di sana? Menurut Xav, dependensi semacam itu tidak dikemas dalam APK , dan menurut saya Anda ingin agar dependensi tersebut dikemas dalam APK.
CommonsWare

@CommonsWare gradle dependenciesuntuk lib android saya: default - Konfigurasi untuk artefak default. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3
mkorszun

Saya tidak tahu bahwa file AAR lokal seperti itu berfungsi - menurut saya file tersebut perlu masuk ke repositori Maven lokal dan direferensikan seperti itu. Tapi aku benar-benar mengacu berjalan gradle dependenciesuntuk aplikasi , bukan untuk perpustakaan bahwa seseorang memutuskan untuk nama "aplikasi".
CommonsWare

@CommonsWare silakan lihat pertanyaan yang diperbarui. Saya telah menginstal library ke repo maven lokal tetapi ini tidak membantu.
mkorszun

Jawaban:


88

Saya telah memecahkan masalah saya dengan mengatur transitiveatribut untuk ketergantungan aar saya:

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

3
@PeterNiederwieser Menghilangkan @aarpenyebab Gradle mencoba mengambil artefak sebagai file .jar. Ini membunuh build.
cwc

4
Itu tidak berhasil untuk saya. Saya memiliki masalah yang tepat. Saya memiliki 2 perpustakaan dan salah satunya menggunakan yang lain. compile project(':LeafPeripheralsContract') { transitive=true }tidak bekerja. Ini mengeluh tentang transitif. Dan saya membuat aardan mencoba menambahkan transitif ke dalamnya. Itu tidak mengeluh tetapi tidak memasukkannya ke dalam paket aar lainnya juga.
tasomaniac

1
Tidak berhasil untuk saya juga. Saya memiliki pengklasifikasi dalam ketergantungan juga. Ingin tahu apakah itu masalahnya. Menggunakan Android Studio RC1 dengan alat build gradle 0.14.4.
lostintranslation

1
Ya, jika Anda menggunakan pengklasifikasi, sepertinya deps transitif tidak berfungsi. Lihat di sini: code.google.com/p/android/issues/…
lostintranslation

2
jika Anda memiliki artefak .jar dan .aar, ini adalah satu-satunya solusi untuk menggunakan @aar dan menyertakan transitif.
Jeffrey Blattman

19

Jangan gunakan "@aar", jika menggunakan "@" menjadi " Artifact only notation ", jika ingin menggunakan "@" dan ingin memiliki ketergantungan transitif, tambahkan "transitive = true"


2
Jawaban ini sangat membantu. Ada kesalahan ketik di komentar saya sebelumnya dan saya menghapus yang itu. Terima kasih atas jawaban Anda, semoga harimu menyenangkan :).
srain

14

Coba ini jika Anda menggunakan aar secara lokal:

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

6
Hai, ini tidak berhasil untuk saya. Saya telah membuat satu proyek perpustakaan yang secara internal menggunakan perpustakaan voli. Saya telah menyertakan file aar yang dibuat menggunakan proyek perpustakaan di aplikasi saya. Saya mendapatkan kesalahan "Kesalahan: (8, 26): paket com.android.volley tidak ada". Dalam proyek perpustakaan saya, saya telah memasukkan voli menggunakan kompilasi (project (': volley')) {transitive = true}
Manish

2
Hai Manish, Menghadapi masalah yang sama, apakah Anda menemukan solusi?
Jalpesh

Saya terjebak dengan masalah yang sama
Alex

1
Apakah Anda termasuk aar sebagai flatDir? Jika demikian, saya akan merujuk Anda ke komentar berikut: stackoverflow.com/questions/25698160/…
FloG

5

Saya mengalami masalah serupa dan merasa saya dapat membagikan langkah-langkah pemecahan masalah tersebut.

Ide dasar untuk tidak dapat menggunakan dependensi transitif saat Anda memublikasikan dependensi Anda sendiri aarsebenarnya tidak memiliki .pomfile yang dihasilkan dengan dependensi transitif yang diharapkan.

Saya menggunakan 'maven-publish'plugin untuk aarketergantungan android saya untuk menerbitkannya di repositori maven pribadi saya. Dependensi transitif tidak terselesaikan ketika proyek saya yang lain menambahkan aarketergantungan saya ke dalamnya build.gradle. Karenanya di sini apa yang saya lakukan untuk memodifikasi .pomfile saat menerbitkan file aar.

Satu hal penting untuk diperhatikan di sini bahwa, dependensi yang Anda inginkan untuk memiliki perilaku transitif harus diimpor menggunakan file apiproyek perpustakaan Anda build.gradleseperti berikut.

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

Sekarang seperti yang saya katakan sebelumnya, saya menggunakan maven-publishplugin untuk mempublikasikan aarketergantungan dan karenanya tugas penerbitan saya di gradle terlihat seperti berikut.

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

Oleh karena itu, saya menggunakan mavenJavatugas lain untuk menerbitkan .pomfile di repo maven pribadi saya sehingga ketika aarfile ditambahkan sebagai ketergantungan ke beberapa modul lain, ia mendapatkan .pominformasi dan mengunduh ketergantungan transitif.

Untuk melengkapi jawabannya, ini adalah bagaimana Anda harus menambahkan ketergantungan di build.gradlefile untuk Anda sendiri yang diterbitkan aaruntuk saya impor.

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

3

transitiveberarti bahwa konsumen (misalnya aplikasi) termasuk produsen dan semua ketergantungan produsen (misalnya perpustakaan). Ini meningkatkan waktu pembuatan dan dapat membuat beberapa masalah dengan versi ketergantungan

Secara default, dependensi Gradle memiliki transitive = true

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

Saat Anda menggunakannya @artifact notationmemilikitransitive = false

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

0

Bagi saya, solusi penerbitan lengkap terlihat seperti ini:


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

The transitive = trueblok diperlukan juga ...


-1

Cukup menambahkan @aar di akhir dependensi yang berhasil bagi saya.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.