Gradle无法解决传递依赖性,但直接依赖性有效

时间:2014-01-26 21:51:19

标签: gradle transitive-dependency maven

我有一个Gradle构建脚本,其中包含以下依赖项(而不是其他):

dependencies {
    testCompile "com.foo:lib-foo:2.0.0-SNAPSHOT"
    testCompile "com.foo:lib-bar:2.0.2-SNAPSHOT"
}

从Maven存储库(Sonatyp Nexus OSS)解析依赖关系。 lib-bar依赖于lib-foo中声明的pom.xml

<dependency>
    <groupId>com.foo</groupId>
    <artifactId>lib-foo</artifactId>
    <version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
</dependency>

当我从构建脚本(以及使用它的所有代码)中删除对lib-bar的依赖时,一切都编译好了。当我声明依赖时,Gradle抱怨:

Could not resolve all dependencies for configuration ':testCompile'.
> Could not find any version that matches com.foo:lib-foo:[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT).
  Required by:
      :my-project:unspecified > com.foo:lib-bar:2.0.2-SNAPSHOT

相同的方案适用于Maven。

tutorial没有提到Gradles处理传递依赖的能力的任何限制 或版本范围可以解释这一点,所以我认为这将工作。我用错了吗?如何让Gradle解决这种依赖?

P.S:

当我运行gradle test --info时,我明白了:

Resource missing. [HTTP HEAD: https://nexus.foo.com/nexus/content/groups/public/com/foo/lib-foo/2.0.0-SNAPSHOT/lib-foo-2.0.0-SNAPSHOT.pom]
Resource missing. [HTTP HEAD: https://nexus.foo.com/nexus/content/groups/public/com/foo/lib-foo/2.0.0-SNAPSHOT/lib-foo-2.0.0-SNAPSHOT.jar]

这些资源确实不存在,因为快照的文件名带有时间戳。但Gradle不应该使用maven-metadata.xml来解决这个问题吗?当我直接声明依赖项时,为什么它可以工作?

2 个答案:

答案 0 :(得分:2)

Gradle对版本范围的支持源自Ivy。我认为发生的情况是不支持快照作为版本范围的边界,因此不会被识别。因此,Gradle尝试将2.0.0-SNAPSHOT3.0.0-SNAPSHOT解析为静态版本。

带有快照边界的版本范围的含义是什么?它们是否与非快照版本匹配(例如2.5)?那么[2.0.0, 3.0.0-SNAPSHOT)的含义是什么?我还没有看到任何Maven文档中定义或提到的这种版本范围。如果这在最近的Maven版本中始终有效,您可能希望在http://forums.gradle.org处提交改进请求。

答案 1 :(得分:0)

虽然彼得提供了有用的见解和最后的提示(RTFM),但他没有发布解决方案,所以来了:

dependencies {
    testCompile "com.foo:lib-foo:2.0.0-SNAPSHOT"
    testCompile("com.foo:lib-bar:2.0.2-SNAPSHOT") {
        transitive = false
    }
}

这告诉Gradle不解决lib-bar的传递依赖关系。在这种情况下,这种方法无需修改,因为lib-bar的唯一传递依赖性已经包含在内。

相关问题