我发现了这个问题:Studio failed to download library from gradle repository,它描述了完全相同的错误,并且该问题有一段构建脚本,您需要将其添加到具有相关 dependency 语句的构建文件中:
repositories {
maven { url 'http://clinker.47deg.com/nexus/content/groups/public' }
}
当我这样做时,它对我有用。
关于为什么会发生这种情况的一般问题(以及为什么不同库的解决方案不同的更好问题):
Android Studio 使用的构建系统 Gradle 能够自动从 Internet 下载库依赖项。总的来说,这对开发人员来说是一个很大的福音,因为不必手动下载存档文件,将它们放在项目中的正确位置,将它们检查到源代码控制中,然后为新版本重复该过程,现在你只需要添加一行构建脚本,构建系统会为您处理家务。主要的缺点是 Internet 连接问题,这会在不同程度上影响不同的开发人员,并且在您遇到错误时会增加一些混淆。
Gradle 如何知道在哪里下载依赖项?大多数 Gradle 构建脚本包含如下所示的块:
repositories {
jcenter()
}
或者它可能是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
}
}
另一个通常也存在于顶级 build.gradle 中,但您可以使用模块的 build.gradle 文件中的另一个块来扩充它。顶层看起来像这样:
allprojects {
repositories {
jcenter()
}
}
和一个模块级的看起来像这个答案中前面的例子之一。这些都是什么意思?
buildscript 块告诉 Gradle 在哪里可以找到构建系统插件。这些插件可以增强构建系统本身的功能,但不会说明您的实际项目。在 Android 项目中,Android Gradle 插件属于这一类,与 Android/Google 库不同,这个确实存在于 Maven Central 上。 buildscript 中的 repositories 块(与 dependencies 块协调,不与项目的依赖块相同,请继续阅读)告诉构建系统去哪里查看对于这些插件。
顶级构建文件中的allprojects 块告诉构建系统将包含的脚本位应用到项目中的所有构建文件。在这个例子中,它告诉它向所有子项目添加一个指向 JCenter 的 repositories 块。这是一种方便,因此您不必将其复制/粘贴到模块中的多个构建文件中。
在您的模块中,您还有一个 repositories 块,它与 allprojects 事物一起,告诉构建系统去哪里获取项目的库依赖项,如前所述。