6

I have an aar of socialauth-android library added to my project. I've put it inside the flatDir directory as described here and it works just fine.
Now, I'm moving some of my code into the library module named commons, to reuse it in the another project. socialauth-android will be used entirely by library module, so I've moved it inside the project/commons/libs/ an rewritten my build.gradle files. From now on I can't build my project, because the following error arises:

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

The error says that dependency resolver tries to find socialauth-android.aar inside the project/libraries folder which is the folder for all common libraries shared between modules of my project. But I've written in my project/commons/build.gradle file that the flatDir for the commons module is project/commons/libs! Moreover, all jar libraries contained inside the project/commons/libs/ are found during the build w/o any issues.

What can be the source of this issue?

Following are my build.gradle files (some of its code, like dependencies declarations, is dropped for brevity):

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'])
}

Upd: project structure added

├── 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
aga
  • 27,954
  • 13
  • 86
  • 121

2 Answers2

10

It appears that the commons library is being built correctly (can you compile it separately to verify?) but the application is not. Gradle has some special rules for handling transitive dependencies (dependences nested in other dependencies) which exists since commons depends on socialauth-android.

Try adding an extra directory to the "flatDir" attribute in "project/app/build.gradle"

flatDir {
    dirs "../libraries", "../commons/libs"
}
Prags
  • 2,457
  • 2
  • 21
  • 38
AndroidGuy
  • 3,371
  • 1
  • 19
  • 21
  • That fixed the issue, thank you very much. The only issue left is that from now on 'app' module knows about some internals of 'commons' module, which seems a little bit dirty to me. Also, it seems strange that 'app' don't need to know about 'commons/libs' directory if all libraries contained in 'commons/libs' are jars, not aars. Nevertheless, thank you for your help, I'll read about transitive dependencies in the Gradle docs. – aga Nov 28 '14 at 08:59
  • Another thing to try would be adding "{transitive=true}" to the compile dependency for common. See http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:configurations – AndroidGuy Nov 28 '14 at 14:51
  • 1
    UP! someone found a cleaner why to do this? – bonnyz Feb 11 '15 at 16:30
  • Indeed working, thank you. Would be nice if the parent module would fetch the library directories of the submodule automatically to avoid those cross-module references... – Marian Klühspies Apr 02 '18 at 14:15
0

Seems to be a known issue that has been there for long time. The way to include the .aar dependency now days is like referenced in this question:

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

By default the resulting artifact will not include the files in the .aar file, unless you create a gradle task that copy the .aar content into your desired artifact.

If you plan to publish your .aar library in a Maven repo, the resulting POM file will have your dependency version set as undefined. To change it, you will need to work with the Dependency Substitution methods from gradle in your project.

Community
  • 1
  • 1
Pablo Valdes
  • 734
  • 8
  • 19