Gradle exclude specific files inside dependency

artifactory, dependencies, gradle, java

Solution

I don't think Gradle has any built in support for accomplishing this, but you can clean the artifacts out from the classpath yourself.

Inspired by this thread on the Gradle forums I came up with this:

// The artifacts we don't want, dependency as key and artifacts as values
def unwantedArtifacts = [
    "dep.location:example": [ "foo-1-0-xml", "bar-1-0", "bar-1-0-async", "bar-1-0-xml"],
]

// Collect the files that should be excluded from the classpath
def excludedFiles = configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll {
    def moduleId = it.moduleVersion.id
    def moduleString = "${moduleId.group}:${moduleId.name}:${moduleId.version}" // Construct the dependecy string
    // Get the artifacts (if any) we should remove from this dependency and check if this artifact is in there
    it.name in (unwantedArtifacts.find { key, value -> moduleString.startsWith key }?.value)
}*.file

// Remove the files from the classpath
sourceSets {
    main {
        compileClasspath -= files(excludedFiles)
    }
    test {
        compileClasspath -= files(excludedFiles)
    }
}

Note that Gradle will probably still download the files and cache them for you, but they should not be in your classpath.

Problem

I was wondering if there was anyway to exclude specific files,that are inside a dependency (not a transitive dependency), from being downloaded. I am switching a build from Ant + Ivy to Gradle and this was done with in Ivy before. I ask because I have a single dependency that contains many compiled wsdl jars in Artifactory that we are pulling down, but I do not want to download all of the jars in the dependency. In Ivy it was setup like: These 6 artifacts are published to Artifactory in to one directory repo/dep.location/example/7.3/jar. ``` <publications> <artifact name="foo-1-0" type="jar" /> <artifact name="foo-1-0-async" type="jar" /> <artifact name="foo-1-0-xml" type="jar" /> <artifact name="bar-1-0" type="jar" /> <artifact name="bar-1-0-async" type="jar" /> <artifact name="bar-1-0-xml" type="jar" /> </publications> ``` This is how I retrieve only two of the six artifacts. ``` <dependency org="dep.location" name="example" rev="7.3" conf="compile,runtime"> <include name="foo-1-0-async"/> <include name="foo-1-0-xml"/> </dependency> ``` Currently if I attempt to do something similar in Gradle the excludes are ignored and all six artifacts are downloaded. ``` compile (group:"dep.location", name:"example", version:"7.3") { exclude module:'foo-1-0-xml' exclude module:'bar-1-0' exclude module:'bar-1-0-async' exclude module:'bar-1-0-xml' } ``` I am using Gradle version 1.8.

Original source