SmarTrRR: a transitive dependency range resolver for Gradle

Posted by

Category :

I am very happy to announce SmarTrRR, that reads “smarter” and it’s an acronym for “Smarter Transitive Range Resolver”. In a previous post I have already discussed how the transitive ranges resolution in Gradle is flawed. The issue was so annoying that I have decided to write a plugin to work it around.


The plugin overrides the project’s dependency resolution strategy and behaves as follow:

  • Apply the substitutions (in case you want to rename some transitive dependencies and point them elsewhere, e.g. to translate into

  • In case of range overlap, compute the intersection range. Force the intersection range to the current and all the previously scanned dependencies

  • In case of pointwise intersection (namely, a single version is compatible), pick such version

  • In case of actual version conflict, pick the highest lower-compatible version. For instance, if there is a conflict between [2.0, 3[ and [3.0, 5[, then 3.0 is selected. As another example, in case of conflict between 1.2 and 1.3, 1.3 is selected (this is similar to the default Gradle behavior).


Use SmarTrRR to resolve transitive dependency ranges

Very little effort is required to enable SmarTrRR in your Gradle build:

buildscript {
    repositories {
    dependencies {
        classpath 'org.danilopianini:smartrrr:0.0.0'
apply plugin: 'org.danilopianini.smartrrr'

That’s it: the plugin will be downloaded from Central, brought in into your build classpath, and used for dependency resolution. Yay!

Configure dependency substitutions

Substitutions are used to point all the instances of some artifact up to certain version to another artifact, or to another version of the same one. A substitutions section in your build.gradle will do the job.

Here is an example:

substitutions {
	substitute 'asm:asm' up_to '6' with 'org.ow2.asm:asm' at '+'
	substitute '' up_to '14.0.1' with '' at '+'

This configuration substitutes any artifact matching asm:asm:[0, 6] with org.ow2.asm:asm:+ and any artifact matching[0, 14.0.1] with

About Danilo Pianini

Fixed-term Post-doc researcher at the University of Bologna. Software engineer, designer and developer of the Protelis programming language, the Alchemist simulator, and several other libraries and tools. Proficient in Java, Kotlin, Scala, Python, Xtend. Can also write in Groovy, Bash, Ruby, C, Rust, Prolog, Javascript. Build automation and continuous integration zealot.

Star DanySK on GitHub
Useful Links