How to use provided scope for jar file in Gradle build?

I need to use Amazon Maps and Amazon Messaging in my apps.

With gradle, I did not succeed in adding the Amazon dependencies with a "provided" scope as they need to be :

The JAR file contains stub implementations of the Amazon Maps API. It does not contain actual implementations of the Maps API classes, so you should not compile the JAR into your app.

None of the solutions provided by Amazon support worked for me.

If someone succeeded to use amazon maps or amazon messaging with Gradle, please share your build.gradle file here.


In the 2.12 release of Gradle, compileOnly was added to give similar functionality to provided scope. There is a difference in what happens in the test classpath. Here is relevant quote and snippet from the release notes:

You can now declare dependencies to be used only at compile time in conjunction with the Java plugin. Compile only dependencies are used only during source compilation and are not included in the runtime classpath or exposed to dependent projects. This behavior is similar to that of the 'provided' scope available in Maven based builds. However, unlike Maven provided dependencies, compile only dependencies in Gradle are not included on the test classpath.

Compile only dependencies should be assigned to the relevant source set's 'compileOnly' configuration.

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}

The solution that I've been using is pretty simple. You must add the following code to your build.gradle file:

apply plugin: 'eclipse'  // Eclipse users only

configurations {
    provided
}

sourceSets {
    main.compileClasspath += configurations.provided
    test.compileClasspath += configurations.provided
    test.runtimeClasspath += configurations.provided
}

eclipse.classpath.plusConfigurations += configurations.provided  // Eclipse users only

If you are not an Eclipse user (I'm not), you don't actually need the first and last lines, as you might have guessed.

Once the above configuration additions are in, you can then simply add a provided dependency in your dependencies section alongside of any regular compile dependencies:

dependencies {
    compile group: 'org.springframework', name: 'spring-core', version: '3.2.6.RELEASE'

    provided group: 'javax.servlet', name: 'servlet-api', version:'2.5'
    provided group: 'javax.servlet.jsp', name: 'jsp-api', version:'2.1'
}

Hope that helps. It's been working quite well for me for some time.


There's now a great plugin from Netflix, gradle-extra-configurations-plugin. It provides a provided and optional scope. No more manual plumbing necessary and also generates the required metadata when pubishing e.g to a maven repository.


A little late to the show, using gradle you copy the .jar to the libs folder and in your gradle file you have:

dependencies {
 ....
 provided files('libs/someLibrary')
 ....
}

There is a prodeps plugin which adds additional optional and provided dependency configurations for Gradle

...
apply plugin: 'propdeps'
...
buildscript {
    repositories {
        maven { url 'http://repo.spring.io/plugins-release' }
    }
    dependencies {
        classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7'
    }
}
...
dependencies {
    ...
    provided('android:android:2.2_r3')
    ...
}
...