Studio无法从gradle存储库下载库

时间:2014-12-18 19:01:33

标签: android gradle android-studio

我已经看到了this的问题,但它并没有帮助我。首先,我尝试使用以下方法在我的项目中添加Google Play服务:

dependencies{
compile 'com.google.android.gms:play-services:6.5.87'
}

它向我显示错误: enter image description here

然后我将我的工作室更新为1.0.1并且gradle为1.0.0。然后我再次用gradle同步项目。它奏效了!尽管上面的截图中显示了两个选项,但它向我展示了另一种选择这是“安装库”(类似的东西)。我点击它然后弹出一个对话框,我安装了库(就像使用SDK管理器的downloadind而不是gradle下载)。

现在,我尝试使用以下方式下载this

compile('com.fortysevendeg.swipelistview:swipelistview:1.0-SNAPSHOT@aar') {
        transitive = true
    }

它给了我错误:enter image description here

我的android存储库已更新:enter image description here

另外,我的网络连接正常。我试图多次同步项目,但一直都是同样的错误。我没有在离线模式下运行gradle:enter image description here

如何解决这个问题?什么是永久解决方案?为什么会发生这一切?

1 个答案:

答案 0 :(得分:6)

我发现了这个问题:Studio failed to download library from gradle repository描述了完全相同的错误,而且这个问题有一些构建脚本需要添加到具有dependency语句的构建文件中:

repositories {
    maven { url 'http://clinker.47deg.com/nexus/content/groups/public' }
}

当我这样做时,它对我有用。

关于为什么会发生这种情况的一般问题(以及为什么解决方案对于不同的库而言不同的更好的问题):

Gradle是Android Studio使用的构建系统,它能够自动从Internet下载库依赖项。总的来说,这对开发人员来说是一个巨大的好处,因为不必手动下载存档文件,将它们放在项目中的正确位置,将它们检入源代码控制,并重复新版本的过程,现在你只需要添加一行构建脚本,构建系统为您处理内务管理。主要的缺点是互联网连接问题,它们不同程度地影响不同的开发人员,并且一些人在发生错误时更加困惑。

Gradle如何知道下载依赖项的位置?大多数Gradle构建脚本都包含一个如下所示的块:

repositories {
    jcenter()
}

或者可能是mavenCentral()而不是jcenter()。这告诉构建系统查看JCenter或Maven Central全局存储库(而JCenter以一种简单的方式思考它是MavenCentral的增值镜像);这些包含许多,许多,许多库的许多版本的档案,并且使用起来非常方便。

您也可以指定其他存储库。此 swipelistview 库尚未上传到Maven Central,因此开发人员已通过网址创建了一个存储库:如果您将该网址添加到repositories块,则会在那里寻找它。

我担心您正在访问该库的SNAPSHOT版本 - 根据定义,这些版本应该是未发布的。但是在我的测试项目中添加对库的快照版本的依赖对我有用,并且在Web浏览器中查看该URL显示只有" 1.0 - " (包括尾随破折号)版本的库,所以我有一些微妙的缺失;如果您了解更多信息,请编辑我的回答或评论。

无论如何,这个解释有几点需要注意。有些图书馆不在Maven Central或任何可通过互联网访问的存档上(至少它们未经Android正式发布),而是作为Android SDK下载的一部分发布,并通过SDK管理器进行维护。 Android支持库和Google库属于此类别。如果您收到有关未找到的错误,则必须通过SDK管理器进行修复。

构建系统如何知道在SDK中查找这些内容,因为您没有通过repositories块告诉它?此行为已硬编码到Android Gradle插件中。

另一个警告是,有一个细节让很多人绊倒,这就是你实际上有两个repositories块,虽然他们经常使用通常的Android Studio设置不同的文件。一个位于buildscript块中,通常位于顶级 build.gradle 文件中,如下所示:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

另一个通常也位于顶级 build.gradle 中,但您可以使用模块的 build.gradle 文件中的另一个块来扩充它。顶级的看起来像这样:

allprojects {
    repositories {
        jcenter()
    }
}

和模块级别看起来就像这个答案中的前面的例子之一。所有这些意味着什么?

buildscript块告诉Gradle在哪里可以找到构建系统插件。这些插件可以增强构建系统本身的功能,但不能说明您的实际项目。在Android项目中,Android Gradle插件属于此类别,与Android / Google库不同,这个确实在Maven Central上运行。 repositories块(与dependencies块协调,与项目的依赖项块相同,继续阅读)buildscript告诉构建系统去哪里寻找这些插件。

顶级构建文件中的allprojects块告诉构建系统将包含的脚本位应用于项目中的所有构建文件。在此示例中,它告诉它将指向JCenter的repositories块添加到所有子项目。这是一种方便,因此您无需将其复制/粘贴到模块中的多个构建文件中。

在您的模块中,您还有一个repositories块,它与allprojects内容一起,告诉构建系统在哪里获取项目的库依赖项,如前所述。