Chris Kessel
Chris Kessel

Reputation: 5875

Gradle: retrieve only one of multiple published artifacts?

I've got an Ivy repository with multiple published artifacts, something like this:

/mygroup/mymodule/1.1.1/mymodule-1.1.1.jar
/mygroup/mymodule/1.1.1/mymodule-client-1.1.1.jar
/mygroup/mymodule/1.1.1/ivy-1.1.1.xml

If I put in the following gradle dependency line, it retrieves both jars. I want to only retrieve the mymodule-client.jar, but I can't figure out the incantation to make that work. Here's the line I have now. I've purposefully excluded transitive dependencies for other reasons.

compile ('mygroup:mymodule:1.1.11') {transitive=false}

Gradle docs seem to indicate there's a way to get just a specific artifact, but I can't get the incantation correct.

Here's the contents of the ivy file. Only the module/artifact names were changed and some standard dependency stuff removed for brevity.

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">

    <info organisation="mygroup" module="mymodule" revision="1.1.1" status="integration" publication="20120111091627"/>

    <publications>
        <artifact name="mymodule"/>
        <artifact name="mymodule-client"/>
    </publications>

    <dependencies> 
       ...          
    </dependencies>
</ivy-module>

Upvotes: 3

Views: 2517

Answers (2)

Peter Niederwieser
Peter Niederwieser

Reputation: 123910

The Ivy module descriptor doesn't assign the artifacts to different configurations, hence it's not possible to retrieve them independently. If all you want is to only put one of the two artifacts on the compile class path, something like the following should work:

configurations {
    mymodule
}

dependencies {
    mymodule 'mygroup:mymodule:1.1.1'
    compile configurations.mymodule.filter { it.name == 'mymodule-client-1.1.1.jar' } 
}

Upvotes: 2

Chris Kessel
Chris Kessel

Reputation: 5875

Managed to find the appropriate line after a lot of trial and error:

compile ('mygroup:mymodule:1.1.1:client@jar')

I think it only works because the "client" is an extension of the module name (called a classifier apparently). If I'd had something named differently, I'm not sure how I'd have resolved it.

I found the example that gave me the clue here: http://scratchpad.pietschy.com/gradle/dependency_management.html

20.2.2.2. Artifact only notation An artifact only notation creates a module dependency which only downloads one artifact file. The notation for such a dependency follows the pattern: [group]:[artifact]:[version]@[extension] or [group]:[artifact]:[version]:[classifier]@[extension]. For example:

dependencies { compile "org.apache.ant:ant-junit:1.7.0@jar" }

Upvotes: 2

Related Questions