Перехідні залежності не вирішені для бібліотеки aar за допомогою gradle


94

Я досліджував деякий час і, мабуть, бачив тут найпопулярніші відповіді, пов'язані з aar та транзитивними залежностями, але якось мені все ще незрозуміло, як зробити так, щоб це працювало.

Тому:

У мене є бібліотека Android з заданою конфігурацією 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'
}

Тоді я розгортаю його в локальному репозиторії maven з gradle install. POM-файл розгорнутої бібліотеки виглядає так:

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

І нарешті, gradle конфігурація мого додатка для Android, використовуючи вищезазначену бібліотеку як залежність:

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

І після розгортання програми на телефоні я отримую NoClassDefFoundErrorкласи, що належать до компіляції залежностей моєї андроїд-бібліотеки.

Перевірка залежностей мого додатка для Android за допомогою 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

Згідно з вищеназваним деревом, всі транзитивні залежності не виявляються. Де проблема і як це правильно робити?


1
Ви вивчали результати запуску gradle dependenciesдля вашого додатка?
CommonsWare

І ви насправді впевнені, що хочете providedключове слово там? За словами Xav, такі залежності не упаковані в APK , і я вважаю, що ви хотіли б, щоб ці пакети були упаковані в APK.
CommonsWare

@CommonsWare gradle dependenciesдля моєї андроїд- бібліотеки : за замовчуванням - конфігурація артефактів за замовчуванням. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3
mkorszun

Мені не відомо, що подібні локальні файли AAR працюють - я думаю, що їм потрібно перейти до локального сховища Maven і мати на них посилання таким чином. Але я на самому справі мав в виду запуску gradle dependenciesдля додатка , а не в бібліотеці, хто - то вирішив назвати «додаток».
CommonsWare

@CommonsWare, будь ласка, дивіться оновлене запитання. Я встановив бібліотеку до локального репозиторію maven, але це не допомагає.
mkorszun

Відповіді:


87

Я вирішив свою проблему, встановивши transitiveатрибут для моєї залежності aar:

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

3
@PeterNiederwieser Опускаючи @aarпричини, за якими Gradle намагається захопити артефакт як файл .jar. Це вбиває збірку.
cwc

4
У мене це не спрацювало. У мене точна проблема. У мене є 2 бібліотеки, і одна з них використовує іншу. compile project(':LeafPeripheralsContract') { transitive=true }не працює. Він скаржився на транзитивне. І я створив aarі спробував додати до нього перехідне. Він не скаржився, але також не включав його в інший пакет aar.
tasomaniac

1
У мене теж не вийшло. У мене є класифікатор і в залежності. Цікаво, чи не в цьому проблема. Використання Android Studio RC1 із засобами побудови gradle 0.14.4.
загублений переклад

1
Так, якщо ви використовуєте класифікатори, здається, перехідні депи не працюють. Подивіться тут: code.google.com/p/android/issues/…
lostintranslation

2
якщо у вас є як артефакти .jar, так і .aar, це єдине рішення для використання @aar та включення транзитивів.
Джеффрі Блаттман,

19

ви не повинні використовувати "@aar", якщо використання "@" стає " Артефактом лише позначення ", якщо ви хочете використовувати "@" і хочете мати залежність транзитивною, вам слід додати "transitive = true"


2
Ця відповідь корисна. У моєму попередньому коментарі була помилка, і я видалив її. Дякую за вашу відповідь, гарного дня :).
srain

14

Спробуйте це, якщо ви використовуєте aar локально:

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

6
Привіт, це не працює для мене. Я створив один бібліотечний проект, який внутрішньо використовує залпову бібліотеку. Я включив файл aar, створений за допомогою проекту бібліотеки, у свою програму. Я отримую помилку "Помилка: (8, 26) помилка: пакет com.android.volley не існує". У своєму бібліотечному проекті я включив залп за допомогою compile (project (': volley')) {transitive = true}
Manish

2
Ей Маніш, зіткнувшись із тим самим питанням, ти знайшов якесь рішення?
Джалпеш,

Я застрягла в тій же проблемі
Алекс

1
Ви включаєте aar як flatDir? Якщо так, то я б направити вас до наступного коментарю: stackoverflow.com/questions/25698160 / ...
пороти

5

У мене була подібна проблема, і я відчував, що можу поділитися етапами її вирішення.

Основна ідея неможливості використовувати перехідні залежності під час публікації власних даних aar- насправді відсутність .pomгенерування файлу з очікуваними перехідними залежностями.

Я використовував 'maven-publish'плагін для своєї aarзалежності від Android, щоб опублікувати його у власному приватному сховищі maven. Перехідні залежності не були вирішені, коли мої інші проекти додавали мою aarзалежність до своїх build.gradle. Звідси я зробив, щоб змінити .pomфайл під час публікації aar.

Важливо зазначити тут, що залежності, які ви хочете мати транзитивною поведінкою, повинні бути імпортовані за допомогою файлу apiпроекту вашої бібліотеки, build.gradleяк показано нижче.

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

Тепер, як я вже говорив раніше, я використовував maven-publishплагін для публікації aarзалежності, а отже, моє публікаційне завдання в gradle виглядає наступним.

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

Отже, я використав інше mavenJavaзавдання, щоб опублікувати .pomфайл у своєму приватному репозиторії maven, щоб, коли aarфайл додається як залежність до якогось іншого модуля, він отримував .pomінформацію та завантажував транзитивну залежність.

Щоб завершити відповідь, ось як слід додати залежність у build.gradleфайл для власного опублікованого aarмені імпортованого.

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

3

transitiveозначає, що споживач (наприклад, додаток) включає виробника та всі залежності виробника (наприклад, бібліотеки). Це збільшує час побудови та може створювати деякі проблеми з версіями залежностей

За замовчуванням залежність Gradle має transitive = true

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

При використанні @artifact notationвін маєtransitive = false

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

0

Для мене повне видавниче рішення виглядає так:


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 = trueБлок потрібно , а також ...


-1

Для мене спрацювало просто додавання @aar в кінці залежності.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.