Gradle 不会解决依赖关系(Maven 会)
Gradle won't resolve dependency (Maven will)
我的项目通过 gradle 配置了依赖项。我想添加以下依赖项:
compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', version: '2.3.1'
可以在以下存储库中找到(我已将其添加到我的 build.gradle):
maven {
url "http://maven.restlet.org"
}
然而,当我这样做时,出现以下错误:
Could not find org.restlet.jse:org.restlet.lib.swagger-models:1.5.0-SNAPSHOT.
http://maven.restlet.org/org/restlet/jse/org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/maven-metadata.xml
http://maven.restlet.org/org/restlet/jse/org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/org.restlet.lib.swagger-models-1.5.0-null-null.pom
http://maven.restlet.org/org/restlet/jse/org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/org.restlet.lib.swagger-models-1.5.0-null-null.jar
Required by: org.restlet.jse:org.restlet.ext.apispark:2.3.1
我可以看到该 jar 实际上在存储库中,但是 Gradle 没有在正确的位置寻找它,原因我不知道。为什么它不使用文件名中的版本而是 1.5.0-null-null.
我已经制作了一个 Maven 项目,该项目具有在 pom.xml 中定义的相同依赖项。
Link to working pom.xml that has same dependency
如何解决这个问题?在这一点上,我对更多手动解决方案也很感兴趣 :) 谢谢。
诊断
似乎与快照“唯一性”有关。有关 Maven 存储库的信息,可以部署快照工件“unique”或“non-unique”。
- 独特的快照: 每次部署快照时,它都会被标记为 timestamp 和 buildNumber,这些时间戳和 buildNumber 写在
maven-metadata.xml
文件中,它们被附加到它的名称中,最终如:artifactName-version-timestamp-buildNumber.jar
.
- 非唯一快照:每次部署快照时它都会覆盖以前的版本,他的名字最终会像:
artifactName-version.jar
.
建议使用唯一快照,因为如果需要可以精确地引用工件的一个版本。
问题是“http://maven.restlet.org”似乎使用了非唯一快照,可悲的是,gradle 似乎有问题处理非唯一快照:https://issues.gradle.org/browse/GRADLE-3164.
如果你查看 http://maven.restlet.com/org/restlet/jse/org.restlet.lib.org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/maven-metadata.xml,你可以在 timestamp 和 buildNumber 标签中清楚地看到 null
:
<metadata>
[...]
<versioning>
<snapshot>
<timestamp>null</timestamp>
<buildNumber>null</buildNumber>
</snapshot>
<lastUpdated>null</lastUpdated>
</versioning>
</metadata>
我想这就是“null-null
”的来源。
解决方案 1 - flatDir
要处理它,您可以手动下载工件,将其放在一个目录中,例如 "lib" 并创建一个 flatDir 存储库:
repositories {
[...]
flatDir {
dirs 'lib'
}
[...]
}
这不是一个理想的解决方案,但它确实有效。
解决方案 2 - jcenter 存储库
添加 jcenter repository 包含您缺少的依赖项并且 Gradle 处理得很好。
因为 Gradle 1.7 你可以简单地定义它:
repositories {
[...]
jcenter()
[...]
}
您似乎需要其他存储库来下载所有依赖项。可能maven会透明地处理这个问题。当 cp
任务为 运行 时,以下脚本成功下载所有依赖项:
apply plugin: 'java'
configurations {
lol
}
repositories {
jcenter()
mavenCentral()
maven {
url "http://maven.restlet.org"
}
maven {
url "https://repository.mulesoft.org/nexus/content/repositories/public/"
}
}
dependencies {
lol group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', version: '2.3.1'
}
task cp(type: Copy) {
from configurations.lol
into 'deps'
}
我的项目通过 gradle 配置了依赖项。我想添加以下依赖项:
compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', version: '2.3.1'
可以在以下存储库中找到(我已将其添加到我的 build.gradle):
maven {
url "http://maven.restlet.org"
}
然而,当我这样做时,出现以下错误:
Could not find org.restlet.jse:org.restlet.lib.swagger-models:1.5.0-SNAPSHOT.
http://maven.restlet.org/org/restlet/jse/org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/maven-metadata.xml
http://maven.restlet.org/org/restlet/jse/org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/org.restlet.lib.swagger-models-1.5.0-null-null.pom
http://maven.restlet.org/org/restlet/jse/org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/org.restlet.lib.swagger-models-1.5.0-null-null.jar
Required by: org.restlet.jse:org.restlet.ext.apispark:2.3.1
我可以看到该 jar 实际上在存储库中,但是 Gradle 没有在正确的位置寻找它,原因我不知道。为什么它不使用文件名中的版本而是 1.5.0-null-null.
我已经制作了一个 Maven 项目,该项目具有在 pom.xml 中定义的相同依赖项。
Link to working pom.xml that has same dependency
如何解决这个问题?在这一点上,我对更多手动解决方案也很感兴趣 :) 谢谢。
诊断
似乎与快照“唯一性”有关。有关 Maven 存储库的信息,可以部署快照工件“unique”或“non-unique”。
- 独特的快照: 每次部署快照时,它都会被标记为 timestamp 和 buildNumber,这些时间戳和 buildNumber 写在
maven-metadata.xml
文件中,它们被附加到它的名称中,最终如:artifactName-version-timestamp-buildNumber.jar
. - 非唯一快照:每次部署快照时它都会覆盖以前的版本,他的名字最终会像:
artifactName-version.jar
.
建议使用唯一快照,因为如果需要可以精确地引用工件的一个版本。
问题是“http://maven.restlet.org”似乎使用了非唯一快照,可悲的是,gradle 似乎有问题处理非唯一快照:https://issues.gradle.org/browse/GRADLE-3164.
如果你查看 http://maven.restlet.com/org/restlet/jse/org.restlet.lib.org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/maven-metadata.xml,你可以在 timestamp 和 buildNumber 标签中清楚地看到 null
:
<metadata>
[...]
<versioning>
<snapshot>
<timestamp>null</timestamp>
<buildNumber>null</buildNumber>
</snapshot>
<lastUpdated>null</lastUpdated>
</versioning>
</metadata>
我想这就是“null-null
”的来源。
解决方案 1 - flatDir
要处理它,您可以手动下载工件,将其放在一个目录中,例如 "lib" 并创建一个 flatDir 存储库:
repositories {
[...]
flatDir {
dirs 'lib'
}
[...]
}
这不是一个理想的解决方案,但它确实有效。
解决方案 2 - jcenter 存储库
添加 jcenter repository 包含您缺少的依赖项并且 Gradle 处理得很好。
因为 Gradle 1.7 你可以简单地定义它:
repositories {
[...]
jcenter()
[...]
}
您似乎需要其他存储库来下载所有依赖项。可能maven会透明地处理这个问题。当 cp
任务为 运行 时,以下脚本成功下载所有依赖项:
apply plugin: 'java'
configurations {
lol
}
repositories {
jcenter()
mavenCentral()
maven {
url "http://maven.restlet.org"
}
maven {
url "https://repository.mulesoft.org/nexus/content/repositories/public/"
}
}
dependencies {
lol group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', version: '2.3.1'
}
task cp(type: Copy) {
from configurations.lol
into 'deps'
}