Studio无法从gradle存储库下载库

ber*_*erk 1 android gradle android-studio

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

dependencies{
compile 'com.google.android.gms:play-services:6.5.87'
}
Run Code Online (Sandbox Code Playgroud)

它向我显示错误: 在此输入图像描述

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

现在,我尝试使用以下方法下载库:

compile('com.fortysevendeg.swipelistview:swipelistview:1.0-SNAPSHOT@aar') {
        transitive = true
    }
Run Code Online (Sandbox Code Playgroud)

它给了我错误: 在此输入图像描述

我的android存储库已更新: 在此输入图像描述

此外,我的互联网连接工作正常.我试图多次同步项目,但一直都是同样的错误.我没有在离线模式下运行gradle:在此输入图像描述

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

Sco*_*rta 6

我发现了这个问题:Studio无法从gradle存储库下载库,它描述了完全相同的错误,而且该问题有一些构建脚本需要添加到具有相关dependency语句的构建文件中:

repositories {
    maven { url 'http://clinker.47deg.com/nexus/content/groups/public' }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

repositories {
    jcenter()
}
Run Code Online (Sandbox Code Playgroud)

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

您也可以指定其他存储库.此swipelistview库尚未上传到Maven Central,因此开发人员通过URL为其提供了一个存储库:如果您将该URL添加到repositories块中,它将在那里查找它.

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

无论如何,这个解释有几点需要注意.有些库不在Maven Central或任何可通过Internet访问的存档上(至少它们不是由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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

allprojects {
    repositories {
        jcenter()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

buildscript块告诉Gradle在哪里可以找到构建系统插件.这些插件增强了构建系统本身的功能,但没有说明您的实际项目.在Android项目中,Android Gradle插件属于此类别,与Android/Google库不同,这个插件确实存在于Maven Central中.该repositories块(协同的dependencies块,这是一样的相关模块为您的项目,请继续阅读)中buildscript告诉构建系统去哪里找这些插件.

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

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