Переходные зависимости не разрешены для библиотеки aar с использованием gradle


95

Я исследовал какое-то время и, вероятно, видел здесь самые популярные ответы, связанные с 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.

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

И вы действительно уверены, что хотите, чтобы providedключевое слово было там? Согласно Xav, такие зависимости не упакованы в APK , и я думаю, вы захотите, чтобы они были упакованы в APK.
CommonsWare 01

@CommonsWare gradle dependenciesдля моей библиотеки Android: по умолчанию - Конфигурация для артефактов по умолчанию. + --- 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 01

@CommonsWare см. Обновленный вопрос. Я установил библиотеку в локальное репозиторий maven, но это не помогает.
mkorszun 01

Ответы:


88

Я решил свою проблему, установив 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.
lostintranslation

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}
Маниш

2
Привет, Маниш, столкнувшись с той же проблемой, вы нашли какое-нибудь решение?
Jalpesh

Я застрял с той же проблемой
Alex

1
Вы включаете aar как flatDir? Если да, то я бы
отослал

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зависимости, и, следовательно, моя задача публикации в градиенте выглядит следующим образом.

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
}

4

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.