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

Я исследовал некоторое время и, вероятно, видел самые популярные ответы здесь, связанные с ААР и транзитивных зависимостей, но почему-то мне все еще не ясно, как заставить это работать.

Так:

У меня есть библиотека 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 config моего приложения для 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

Согласно приведенному выше дереву, все переходные зависимости не обнаружены. Где проблема и как это сделать правильно?

8 ответов

Решение

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

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

Вы не должны использовать "@aar", если "@" становится " нотацией только для артефактов", если вы хотите использовать "@" и хотите иметь переходную зависимость, вы должны добавить "transitive=true"

Попробуйте это, если вы используете aar локально:

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

У меня была аналогичная проблема, и я чувствовал, что могу поделиться шагами по ее решению.

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

Я использовал 'maven-publish' плагин для моего андроида aarзависимость опубликовать его в моем собственном частном репозитории 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
}

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
}

Файл AAR не содержит транзитивных зависимостей. Так что даже если использовать API вместо реализации, это не сработает.

В нашей команде мы разработали библиотеку для использования в наших приложениях, и мы хотели, чтобы она предназначалась только для внутреннего использования. Раньше мы включали целый модуль, который вроде бы работал. Позже мы решили перейти к файлу aar, но столкнулись с той же проблемой classpath not found . После некоторых исследований мы узнали, что мы также можем использовать локальное репозиторий maven. Мы решили этим воспользоваться.

Вот пошаговый процесс

Публикация репозитория

1. В корневом файле build.gradle вашей библиотеки необходимо включить

      id 'com.github.dcendents.android-maven' version '2.0' apply false

2. В файле build.gradle уровня модуля вашей библиотеки вам нужно добавить

а) В плагинах

      id 'maven-publish'

б) В нижней части файла градиента добавить

      publishing {
    publications {
        release(MavenPublication) {
            groupId = 'com.demo.android'
            artifactId = 'qrcodescanner'
            version = '1.0.0'

            afterEvaluate {
                from components.release
            }
        }
    }
    repositories {
        maven {
            name = "qrcodescanner"
            url = "${project.buildDir}/repo"

        }
    }
}

3. В зависимости от имени, которое вы дали, будут созданы задачи gradle, которые вы можете проверить с помощью задач gradlew или с помощью окна gradle в верхнем правом углу в студии Android. Наш был

      publishReleasePublicationToQrcodescannerRepository

4. Запустите его, и репо будет создано по заданному пути.

      gradlew publishReleasePublicationToQrcodescannerRepository
  1. Последний шаг, который вам нужно опубликовать на maven local, используя

    gradlew publishToMavenLocal

если это не сработает, вы можете попробовать gradlew clean и gradlew build перед его выполнением.

Использование локального репо

1. Вам нужно добавить mavenLocal() в файл build.gradle корневого уровня вашего проекта, в котором вы хотели его использовать, прежде чем другие центральные репозитории.

      allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()
        maven { url "https://jitpack.io" }
        mavenCentral()
    }
}
  1. Теперь вам нужно включить свою зависимость в проект, как мы это делаем с другими зависимостями.

implementation 'com.demo.android:qrcodescanner:1.0.0'имейте в виду, что формат должен groupdId:artifactId:version

Вот и все.

Использованная литература :

Опубликовать библиотеку

Местный знаток

Для меня полное издательское решение выглядит так:


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 блок также требуется...

Простое добавление @aar в конце зависимости - вот что у меня сработало.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Другие вопросы по тегам