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
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
[3.0, 5[, then
3.0is selected. As another example, in case of conflict between
1.3is 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:
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:
This configuration substitutes any artifact matching
asm:asm:[0, 6] with
org.ow2.asm:asm:+ and any artifact matching
com.google.guava:guava:[0, 14.0.1] with