使用Gradle无法解析Aar库的传递依赖


93

我调查了一段时间,可能在这里看到了与aar和可传递依赖项有关的最流行的答案,但是对于我来说,如何使它起作用仍然不清楚。

所以:

我有给定gradle配置的android库:

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>

最后使用上述库作为依赖项对我的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以下命令检查我的android应用程序依赖项:

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 2014年

并且您确实确定要在provided此处输入关键字吗?根据Xav的说法,此类依赖项未打包在APK中,我认为您希望将其打包在APK中。
CommonsWare 2014年

gradle dependencies我的Android库的@CommonsWare :默认-默认工件的配置。+ --- com.google.code.gson:gson:2.2.4 + --- com.bugsense.trace:bugsense:3.6 \ --- commons-net:commons-net:3.3
mkorszun 2014年

我不知道像这样的本地AAR文件可以工作-我认为它们需要进入本地Maven存储库并以这种方式引用。但是我确实是指gradle dependencies为该应用程序运行,而不是为某个人决定将其命名为“ app”的库。
CommonsWare 2014年

@CommonsWare,请参阅更新的问题。我已经将库安装到本地Maven存储库,但这无济于事。
mkorszun 2014年

Answers:


87

我已经通过transitive为aar依赖项设置属性解决了我的问题:

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

3
@PeterNiederwieser忽略@aar原因Gradle尝试将工件作为.jar文件获取。这杀死了构建。
cwc 2014年

4
它对我没有用。我有确切的问题。我有2个库,其中一个正在使用另一个。compile project(':LeafPeripheralsContract') { transitive=true }不工作。它抱怨传递。我创建了一个,aar并尝试向其添加可传递对象。它没有抱怨,但也没有将其包含在其他aar包中。
tasomaniac

1
也没有为我工作。我在依赖项中也有一个分类器。想知道这是否是问题。将Android Studio RC1与gradle构建工具0.14.4结合使用。
lostintranslation 2014年

1
是的,如果您使用的是分类器,那么传递性部门似乎不起作用。看看这里:code.google.com/p/android/issues/...
lostintranslation

2
如果同时具有.jar和.aar工件,则这是使用@aar并包含传递对象的唯一解决方案。
Jeffrey Blattman

18

您不应该使用“ @aar”,如果使用“ @”成为“ 仅工件符号,则如果要使用“ @”并且希望具有依赖项可传递,则应添加“ transitive = true”


2
这个答案很有帮助。我之前的评论中有错别字,我删除了那个错字。谢谢您的回答,祝您有美好的一天:)。
srain

14

如果您在本地使用aar,请尝试以下操作:

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

6
嗨,它对我不起作用。我创建了一个图书馆项目,在内部使用排球图书馆。我在应用程序中包含了使用库项目创建的文件。我收到“错误:(8,26)错误:包com.android.volley不存在”错误。在我的图书馆项目中,我包括了使用compile(project(':volley')){传递= true}的凌空
抽空

2
嘿Manish,面对同样的问题,您找到任何解决方案了吗?
Jalpesh

我遇到了同样的问题
Alex

1
您是否将aar作为flatDir包括在内?如果是这样,我将向您推荐以下评论:stackoverflow.com/questions/25698160/…–
FloG

5

我遇到了类似的问题,觉得可以分享解决问题的步骤。

在发布自己aar.pom文件时不能使用传递依赖关系的基本思想实际上是没有使用预期的传递依赖关系生成文件。

我将'maven-publish'插件用于我的android 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依赖关系,因此我在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
}

2

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'
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.