Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle exclude specific files inside dependency

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.

like image 742
bhumphrey Avatar asked May 13 '14 19:05

bhumphrey


People also ask

How do I exclude tasks in Gradle?

Using Command Line Flags Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses > Task :test > ... To skip any task from the Gradle build, we can use the -x or –exclude-task option. In this case, we'll use “-x test” to skip tests from the build.

What is CompileOnly in Gradle?

compileOnly dependencies are available while compiling but not when running them. This is equivalent to the provided scope in maven. It means that everyone who wants to execute it needs to supply a library with all classes of the CompileOnly library.

What is a transitive dependency Gradle?

Transitive dependencyA variant of a component can have dependencies on other modules to work properly, so-called transitive dependencies. Releases of a module hosted on a repository can provide metadata to declare those transitive dependencies. By default, Gradle resolves transitive dependencies automatically.


2 Answers

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.

like image 106
Raniz Avatar answered Oct 01 '22 05:10

Raniz


I am not sure if this is what you want, but since we are using Spring Boot and Wildfly, we have to remove the tomcat-starter module from the spring boot standard package, and it looks very similar to what you've done. However, our code states:

configurations {     compile.exclude module: "spring-boot-starter-tomcat" } 

I have not checked if the corresponding jar is not downloaded or just not on the classpath, I know however that it is not used anymore.

like image 26
Stefan Helmerichs Avatar answered Oct 01 '22 07:10

Stefan Helmerichs