Gradle不会解决依赖(Maven会)

时间:2015-04-10 09:14:31

标签: java maven gradle maven-3 restlet

我的项目通过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

如何解决此问题?我现在在更多手动解决方案中也很有趣:)谢谢。

2 个答案:

答案 0 :(得分:6)

诊断

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

  • 唯一快照:每次部署快照时,都会标记时间戳 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,则可以在时间戳 buildNumber 标记中清楚地看到null

<metadata>
  [...]
  <versioning>
    <snapshot>
      <timestamp>null</timestamp>
      <buildNumber>null</buildNumber>
    </snapshot>
    <lastUpdated>null</lastUpdated>
  </versioning>
</metadata>

我认为&#34; null-null&#34;来自。

解决方案1 ​​ - flatDir

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

repositories {
    [...]
    flatDir {
        dirs 'lib'
    }
    [...]
}

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

解决方案2 - jcenter存储库

Suggested by Opal

添加包含您缺少的依赖项的jcenter repository,并且Gradle处理得很好。

Gradle 1.7以来,您只需使用以下内容定义它:

repositories {
    [...]
    jcenter()
    [...]
}

答案 1 :(得分:3)

您似乎需要其他存储库来下载所有依赖项。可能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'
}