First of all, I think Gradle is great. It does very well a lot of things. One of the things it just does not get along with is version range resolution. For how I understand it, this behaviour is inherited from Ivy, but it is nonetheless plain insane.
Suppose you are developing a project, which declares a dependency upon two libraries: foo and bar. Both of those dependencies use Google Guava. foo declares compatibility with Guava [14.0, 17.0]. bar declares compatibility with Guava [16.0, 18.0]. The most obvious behaviour is to select the highest version that is compatible with both ranges (in this case, 17.0 should be selected). This is what happens instead: