【问题标题】:Can't use local .aar file inside the library module无法在库模块中使用本地 .aar 文件
【发布时间】:2015-01-26 03:41:54
【问题描述】:

我的项目中添加了 aarsocialauth-android 库。我已将它放在flatDir 目录中,如here 所述,它工作得很好。
现在,我将我的一些代码移动到名为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 添加了它。如果我需要添加其他内容 - 请告诉我。谢谢。 :)

标签: android gradle android-studio android-gradle-plugin


【解决方案1】:

似乎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 文档中阅读有关传递依赖项的信息。
  • 要尝试的另一件事是将“{transitive=true}”添加到common 的编译依赖项中。见gradle.org/docs/current/userguide/…
  • 上!有人找到了清洁工为什么要这样做?
  • 确实有效,谢谢。如果父模块会自动获取子模块的库目录以避免那些跨模块引用,那就太好了......
【解决方案2】:

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

Adding local .aar files to Gradle build using "flatDirs" is not working

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2015-03-19
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多