Gradle依赖解析总是首先尝试mavenCentral?

Posted

技术标签:

【中文标题】Gradle依赖解析总是首先尝试mavenCentral?【英文标题】:Gradle dependency resolution always trying mavenCentral first? 【发布时间】:2014-02-10 00:36:25 【问题描述】:

我有一个包含 javax.jms:jms:1.1 的依赖链。在 maven Central 中,该工件有一个 POM,但 jar 似乎丢失了(maven central 有问题)。但是,我们有一个本地存储库,其中包含我们需要的工件。所以,我认为这只是将我们的本地存储库放在首位,然后是 mavenCentral() 最后:

repositories 
    maven  url 'http://local-maven:12345/repo' 
    mavenCentral()

但是,当运行 gradle -i 时,我们可以看到它首先查看 mavenCentral。因为它在 mavenCentral 上找到了 POM,所以它没有查看任何其他存储库,但是由于缺少 jar,构建失败:

Download http://repo1.maven.org/maven2/javax/jms/jms/1.1/jms-1.1.pom
Resource missing. [HTTP GET: http://repo1.maven.org/maven2/javax/jms/jms/1.1/jms-1.1.jar]
....
* What went wrong:
Execution failed for task 'unzipDependencies'.
> Could not resolve all dependencies for configuration 'compile'.
   > Could not download artifact 'javax.jms:jms:1.1:jms.jar'
      > Artifact 'javax.jms:jms:1.1:jms.jar' not found.

那么为什么它首先看 mavenCentral 呢?为什么不先查看我自己的 Maven 存储库?如果是这样,问题就会得到解决,因为它会发现 javax.jms:jms:1.1:jms.jar 很好......但我看不出有什么方法可以强制这样做。

【问题讨论】:

【参考方案1】:

按照声明的顺序搜索存储库。我最好的猜测是您没有将 POM 发布到本地存储库,这就是继续搜索的原因。所以要么解决这个问题,要么告诉 Gradle Maven Central 中的一些模块在你的本地存储库中有它们的工件:

repositories 
    maven 
        url "http://repo1.maven.org/maven2"
        artifactUrls "http://local-maven:12345/repo"          
    

【讨论】:

POM 肯定在本地 maven 中。如果我完全删除 mavenCentral(),它会起作用(当然,只要我删除仅在 maven Central 中的其他依赖项)。我不想重新定义 artifactUrls,因为不是每个依赖项都在 local-maven 中,所以我仍然在某些事情上依赖 maven Central。 很难说没有看到所有的细节。无论如何,artifactUrls 配置 additional 工件 URL。它专为 Maven Central 仅包含模块的 POM 的用例而设计。它仍然会在 Maven Central 中找到所有内容。 @PeterNiederwieser 正是这为我解决了 jms-1.1.jar 的问题。我将"https://repository.jboss.org/nexus/content/groups/public" 添加为artifactUrl。 @Depressio 请接受彼得的回答作为解决方案。【参考方案2】:

由于许可问题,JMS jar 已从 maven Central 中删除。如果您使用的是较新版本的 Gradle,则可以指定不同的 gradle 存储库作为 JMS jar 的独家提供者。这将允许您从 maven Central 中提取其余依赖项而不会出错。

repositories 
    mavenCentral()
    exclusiveContent 
        forRepository 
            maven 
                url "https://repository.jboss.org/maven2"
            
        
        filter 
            // this repository *only* contains artifacts with group "javax.jms"
            includeGroup "javax.jms"
        
    

【讨论】:

以上是关于Gradle依赖解析总是首先尝试mavenCentral?的主要内容,如果未能解决你的问题,请参考以下文章

Android studio - gradle无法解析依赖项

Gradle 构建无法解析所有 Path_provider 依赖项

同步 gradle 的问题:无法解析外部依赖项 com.android.tools.build:gradle,因为没有定义存储库

gradle 到 maven 的转换,在依赖项的依赖项的版本名称中解析通配符“+”?

在最后一个 gradle 版本中无法解析 android studio 中的 jitpack 依赖项

如何告诉 Grails 使用 Gradle 解决依赖关系