我有一个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
来解决这个问题吗?当我直接声明依赖项时,为什么它可以工作?
答案 0 :(得分:2)
Gradle对版本范围的支持源自Ivy。我认为发生的情况是不支持快照作为版本范围的边界,因此不会被识别。因此,Gradle尝试将2.0.0-SNAPSHOT
和3.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
的唯一传递依赖性已经包含在内。