【问题标题】:Gradle won't resolve dependency (Maven will)Gradle 不会解决依赖关系(Maven 会)
【发布时间】:2015-06-15 22:44:40
【问题描述】:

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

如何解决这个问题?在这一点上,我对更多手动解决方案也很感兴趣 :) 谢谢。

【问题讨论】:

  • 小题外话。 gradle 是否使用与 maven 相同的存储库?
  • 你能展示一下可行的 maven 配置吗?
  • @Antoniossss gradle 使用您告诉它使用的存储库。它可以使用 Maven Central,但也可以使用其他存储库,就像 maven 一样。有关如何将 Maven Central 与 gradle 一起使用的示例,请参阅 gradle.org/docs/current/userguide/…
  • @superbob 谢谢:)
  • @Antoniossss No. Gradle 被配置为使用 maven central 和 maven.restlet.org。 Maven 使用的是 Maven.restlet.org 和 repository-master.mulesoft.org/releases。但是问题是 maven 可以解决 maven.restlet.org 中 gradle 无法解决的特定依赖关系。

标签: java maven gradle maven-3 restlet


【解决方案1】:

诊断

这似乎与快照“唯一性”有关。有关 Maven 存储库的信息,快照工件可以部署为“unique”或“non-unique”。

  • 唯一快照:每次部署快照时,都会用timestampbuildNumber标记,这些timestamp和buildNumber都写在@ 987654328@ 文件,并将它们附加到其名称后,最终结果如下:artifactName-version-timestamp-buildNumber.jar
  • 非唯一快照:每次部署快照都会覆盖以前的版本,他的名字最终会变成:artifactName-version.jar

建议使用唯一快照,因为如果需要,可以精确引用工件的一个版本。

问题在于“http://maven.restlet.org”似乎使用了非唯一快照,可悲的是,gradle 似乎在处理非唯一快照时遇到了问题:@987654321 @。

如果您查看http://maven.restlet.com/org/restlet/jse/org.restlet.lib.org.restlet.lib.swagger-models/1.5.0-SNAPSHOT/maven-metadata.xml,您可以在timestampbuildNumber 标签中清楚地看到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 存储库

Suggested by Opal

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

由于Gradle 1.7,您可以简单地定义它:

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

【讨论】:

  • 我认为我们也可以修复 restlet 存储库。我为此添加了一个问题:github.com/restlet/restlet-framework-java/issues/1054
  • @ThierryBoileau,那确实很好 :) Maven 官方文档对该主题并不十分清楚(快照唯一性)。特别是关于 Maven 版本之间的变化(1->2、2->3)。这就是为什么我没有在我的回答中提供很多指向 maven.org 的链接。但无论如何你应该能够弄清楚细节
【解决方案2】:

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

【讨论】:

  • 那是因为 jcenter 包含缺少的依赖,maven central 没有。
  • 是的。我并不是说这个解决方案不好。但这不是“奇怪”。此外,阅读响应并不明显,该解决方案实际上是“添加 jcenter 存储库”。可能会突出显示以使其更清晰。
  • 这是我在实施中实际采用的解决方案。然而,答案并没有试图解释为什么它一开始就不起作用。
  • @Opal,除非它打扰您,否则我会将您的解决方案包含在我的答案中以做出更完整的答案,因为 OP 实际上使用了您的解决方案。 PS:我赞成你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2017-07-04
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多