Android Gradle为什么我们需要“allprojects”?

时间:2015-06-25 10:37:20

标签: android gradle android-gradle

当我尝试将Gson添加到现有的Android gradle项目时,我遇到了一个问题。

例外是这样的

  

“未能解决:com.google.code.gson:gson:2.3.1”

我的build.gradle

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


apply plugin: 'android'

dependencies {
    compile 'com.google.code.gson:gson:2.3.1'
.
.

经过一些搜索和反复试验后,我发现您需要添加以下内容来解决问题:

allprojects {
    repositories {
        jcenter()
    }
}

为什么我们需要两次引用jcenter,为什么“allprojects”对解决这个问题很重要?

2 个答案:

答案 0 :(得分:4)

  

经过一些搜索和跟踪和错误后,我发现您需要添加以下内容来解决问题

仅当您拥有传统的Android Studio项目时,才能将应用程序划分为模块(例如app/)。真正需要的是模块知道从哪里获取依赖关系。

  

为什么我们需要两次引用jcenter

repositories闭包中的buildscript闭包说“这些是从中提取Gradle插件的工件存储库以及为dependencies闭包本身列出的其他buildscript”。

repositories关闭中的allprojects闭包说“这些是从中提取自己的应用程序的工件存储库dependencies”。

在传统的Android Studio项目中,allprojects闭包位于项目根目录中的build.gradle文件中。 allprojects说“此闭包中的所有内容,请应用于此项目中所有模块的Gradle配置,例如那里的app/模块”。

现在,您的问题中的build.gradle代码段暗示您可能拥有传统的Android Studio项目,而是有一个您没有app/的项目模块,您只有一个build.gradle文件。在这种情况下,allprojects本身不是必需的(因为没有模块),但您仍需要指定repositories是什么。

例如,以下是来自a module-less projectbuild.gradle文件:

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

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
    maven {
        url "https://repo.commonsware.com.s3.amazonaws.com"
    }
}

dependencies {
    compile 'de.greenrobot:eventbus:2.4.0'
    compile 'com.android.support:support-v13:21.0.3'
    compile 'com.commonsware.cwac:wakeful:1.0.+'
}

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"

        defaultConfig {
            targetSdkVersion 17
        }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

这里,除了repositories内的buildscript闭包(用于定义插件的来源),我还有一个顶级repositories闭包,用于定义顶部位置 - 等级dependencies来自。

答案 1 :(得分:0)

它们只是存储库的不同存储库。 GSON显然在JCentral中,其他人正在使用Maven Ventral。

从阅读JCenter开始,它就是Bintray背后的存储库,来自JFrog公司(我之前遇到过,我想这就是'J'来自的地方)。根据Bintray的博客,Bintray是Maven Central的超集。