4

我有一个 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。

教程没有提到对 Gradles 处理传递依赖或版本范围的任何限制来解释这一点,所以我认为这会起作用。我用错了吗?我怎样才能让 Gradle 解决这种依赖关系?

PS:

当我跑步时,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用来解决这个问题吗?为什么当我直接声明依赖项时它会起作用?

4

2 回答 2

2

虽然 Peter 提供了有用的见解和最终提示 ( 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已经包含了唯一的传递依赖。

于 2014-01-27T16:12:07.477 回答
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提交改进请求。

于 2014-01-26T22:17:21.337 回答