Why doesn't Gradle include transitive dependencies in compile / runtime classpath?

Posted by Francis Toth on Programmers See other posts from Programmers or by Francis Toth
Published on 2013-06-23T22:08:22Z Indexed on 2013/06/24 16:36 UTC
Read the original article Hit count: 459

Filed under:
|

I'm learning how Gradle works, and I can't understand how it resolves a project transitive dependencies.

For now, I have two projects :

  • projectA : which has a couple of dependencies on external libraries
  • projectB : which has only one dependency on projectA

No matter how I try, when I build projectB, gradle doesn't include any projectA dependencies (X and Y) in projectB's compile or runtime classpath. I've only managed to make it work by including projectA's dependencies in projectB's build script, which, in my opinion does not make any sense. These dependencies should be automatically attached to projectB. I'm pretty sure I'm missing something but I can't figure out what.

I've read about "lib dependencies", but it seems to apply only to local projects like described here, not on external dependencies.

Here is the build.gradle I use in the root project (the one that contains both projectA and projectB) :

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.3'
    }
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'

    group = 'com.company'

    repositories {
        mavenCentral()
        add(new org.apache.ivy.plugins.resolver.SshResolver()) {
            name = 'customRepo'
            addIvyPattern "ssh://.../repository/[organization]/[module]/[revision]/[module].xml"
            addArtifactPattern "ssh://.../[organization]/[module]/[revision]/[module](-[classifier]).[ext]"
        }
    }

    sourceSets {
        main {
            java {
                srcDir 'src/'
            }
        }
    }

    idea.module { downloadSources = true }

    // task that create sources jar
    task sourceJar(type: Jar) {
        from sourceSets.main.java
        classifier 'sources'
    }

    // Publishing configuration
    uploadArchives {
        repositories {
            add project.repositories.customRepo
        }
    }

    artifacts {
        archives(sourceJar) {
            name "$name-sources"
            type 'source'
            builtBy sourceJar
        }
    }
}

This one concerns projectA only :

version = '1.0'
dependencies {
    compile 'com.company:X:1.0'
    compile 'com.company:B:1.0'
}

And this is the one used by projectB :

version = '1.0'
dependencies {
    compile ('com.company:projectA:1.0') {
        transitive = true
    }
}

Thank you in advance for any help, and please, apologize me for my bad English.

© Programmers or respective owner

Related posts about builds

Related posts about build-system