Gradle不会解决依赖(Maven会)

bri*_*und 2 java restlet gradle maven-3 maven

我的项目通过gradle配置了依赖项.我想添加以下依赖项:

compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', version: '2.3.1'
Run Code Online (Sandbox Code Playgroud)

哪个可以在以下存储库中找到(我已添加到我的build.gradle中):

maven {
    url "http://maven.restlet.org"
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我可以看到jar实际上是在存储库中,但Gradle并没有在正确的位置寻找它,原因我不知道.为什么它不使用文件名中的版本而是1.5.0-null-null.

我创建了一个Maven项目,它具有在pom.xml中定义的相同依赖关系.

链接到具有相同依赖关系的工作pom.xml

如何解决这个问题?我在这一点上也有趣于更多的手动解决方案:)谢谢.

sup*_*bob 6

诊断

它似乎与快照" 唯一性 "有关.有关Maven存储库的信息,可以将快照工件部署为" 唯一 "或" 非唯一 ".

  • 唯一快照:每次部署快照时,都会使用时间戳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你可以清楚地看到nulltimestampbuildNumber标签中看到:

<metadata>
  [...]
  <versioning>
    <snapshot>
      <timestamp>null</timestamp>
      <buildNumber>null</buildNumber>
    </snapshot>
    <lastUpdated>null</lastUpdated>
  </versioning>
</metadata>
Run Code Online (Sandbox Code Playgroud)

我认为这就是" null-null"的来源.

解决方案1 ​​ - flatDir

要处理它,您可以手动下载工件,将其放在目录中,例如"lib"并创建一个flatDir存储库:

repositories {
    [...]
    flatDir {
        dirs 'lib'
    }
    [...]
}
Run Code Online (Sandbox Code Playgroud)

这不是一个理想的解决方案,但它确实有效.

解决方案2 - jcenter存储库

Opal建议

添加包含缺少的依赖项的Jcenter存储库,并且Gradle处理得很好.

Gradle 1.7开始,您只需使用以下命令定义它:

repositories {
    [...]
    jcenter()
    [...]
}
Run Code Online (Sandbox Code Playgroud)