无法在库模块中使用本地.aar文件

6
我在我的项目中添加了一个名为 socialauth-android 的库的 aar 文件。按照这里所述,我将它放在flatDir目录下并成功使用。
现在,我正在将一些代码移动到名为commons的库模块中,以便在另一个项目中重用它。整个库模块将完全使用 socialauth-android,因此我将其移到了project/commons/libs/目录下,并重写了我的 build.gradle文件。从此以后,我无法构建我的项目,因为出现以下错误:
Error:A problem occurred configuring project ':ScrollApplication'.
> Could not resolve all dependencies for configuration ':ScrollApplication:_developmentDebugCompile'.
   > Could not find :socialauth-android:.
     Searched in the following locations:
         http://dl.bintray.com/populov/maven//socialauth-android//socialauth-android-.pom
         http://dl.bintray.com/populov/maven//socialauth-android//socialauth-android-.aar
         https://oss.sonatype.org/content/repositories/snapshots//socialauth-android//socialauth-android-.pom
         https://oss.sonatype.org/content/repositories/snapshots//socialauth-android//socialauth-android-.aar
         https://repo1.maven.org/maven2//socialauth-android//socialauth-android-3.2.pom
         https://repo1.maven.org/maven2//socialauth-android//socialauth-android-3.2.aar
         file:/home/artem/Workspace/scrollandroid/libraries/socialauth-android-3.2.aar
         file:/home/artem/Workspace/scrollandroid/libraries/socialauth-android.aar
     Required by:
         scrollandroid:ScrollApplication:unspecified > scrollandroid:commons:unspecified

错误提示说,依赖解析器试图在project/libraries文件夹中查找socialauth-android.aar,而这是我项目所有模块共享的公共库文件夹。但是我在project/commons/build.gradle文件中写道,commons模块的flatDirproject/commons/libs!此外,在project/commons/libs/文件夹中包含的所有jar库都可以在构建过程中被找到而没有任何问题。
这个问题的根源是什么呢?
以下是我的build.gradle文件(为了简洁起见,省略了某些代码,如依赖声明): project/settings.gradle:
include ':ScrollApplication', ':commons'

project/build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0-rc1'
    }
}

project/commons/build.gradle:

apply plugin: 'com.android.library'

repositories {
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
    mavenCentral()

    flatDir {
        dirs "libs"
    }
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile(name:'socialauth-android', ext:'aar')
}

project/app/build.gradle:

apply plugin: 'com.android.application'

repositories {
    maven { url "http://dl.bintray.com/populov/maven" }
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }

    mavenCentral()

    flatDir {
        dirs "../libraries"
    }
}

configurations {
    apt
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
    }

    lintOptions {
        abortOnError false
    }
}

dependencies {
    compile project(':commons')

    compile fileTree(dir: '../libraries', include: ['*.jar'])
}

更新: 添加了项目结构

├── build.gradle
├── commons
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
│       ├── androidTest
│       │   └── java
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets
│           ├── java
│           └── res
├── gradle
│   └── wrapper
├── libraries
│   ├── aws-android-sdk-1.7.1.1-core.jar
│   ├── aws-android-sdk-1.7.1.1-s3.jar
│   ├── libGoogleAnalyticsServices.jar
│   └── supertooltips-3.0.1.aar
├── scrollandroid-hg.iml
├── ScrollApplication
│   ├── build.gradle
│   ├── proguard.cfg
│   ├── ScrollApplication.iml
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets
│           ├── java
│           └── res
├── settings.gradle
└── stacktrace.txt

你能提供一份目录结构清单吗? - AndroidGuy
@AndroidGuy,好的,给你。 :) - aga
抱歉不断地向您提出请求,但是能否列出“libraries”目录中的所有文件(和文件夹)。 - AndroidGuy
@AndroidGuy 已添加。如果我需要添加其他内容 - 只需告诉我。谢谢。 :) - aga
2个回答

10

看起来commons库正在正确构建(你可以单独编译它验证吗?),但应用程序没有。Gradle有一些特殊规则来处理传递依赖项(嵌套在其他依赖项中的依赖项),这是因为commons依赖于socialauth-android

尝试在"project/app/build.gradle"的"flatDir"属性中添加一个额外的目录。

flatDir {
    dirs "../libraries", "../commons/libs"
}

问题已解决,非常感谢。唯一剩下的问题是,从现在开始,“app”模块知道“commons”模块的一些内部细节,这似乎有点不太好。此外,如果所有库都包含在'commons/libs'中是jars而不是aars,则'app'不需要了解'commons/libs'目录似乎很奇怪。尽管如此,感谢您的帮助,我将阅读Gradle文档中的传递性依赖项。 - aga
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - AndroidGuy
1
有人找到了更简洁的方法吗?UP! - bonnyz
确实工作,谢谢。如果父模块能自动获取子模块的库目录,以避免这些跨模块引用,那将是很好的。 - Marian Klühspies

0

似乎这是一个已经存在很长时间的已知问题。现在包含 .aar 依赖项的方法就像在这个问题中引用的那样:

使用“flatDirs”将本地 .aar 文件添加到 Gradle 构建中不起作用

默认情况下,生成的构件不会包括 .aar 文件中的文件,除非您创建一个 gradle 任务将 .aar 内容复制到所需的构件中。

如果您计划在 Maven 存储库中发布 .aar 库,则生成的 POM 文件将将您的依赖项版本设置为未定义。要更改它,您需要在项目中使用 gradle 的依赖项替换方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接