224

What is the difference between declaring repositories in the buildscript section of the gradle build or in the root level of the build.

buildscript {
    repositories {
        mavenCentral();
    }
}

versus

repositories {
    mavenCentral();
}
Dave Jarvis
  • 30,436
  • 41
  • 178
  • 315
Jeff Storey
  • 56,312
  • 72
  • 233
  • 406

2 Answers2

202

The repositories in the buildscript block are used to fetch the dependencies of your buildscript dependencies. These are the dependencies that are put on the classpath of your build and that you can refer to from your build file. For instance extra plugins that exist on the internet.

The repositories on the root level are used to fetch the dependencies that your project depends on. So all the dependencies you need to compile your project.

Dave Jarvis
  • 30,436
  • 41
  • 178
  • 315
Hiery Nomus
  • 17,429
  • 2
  • 41
  • 37
  • 29
    If I need maven central for both my buildscript and my project, do I need to declare it twice? – Marcin Koziński Mar 01 '14 at 10:46
  • 28
    Yes, you need to specify it twice then indeed. – Hiery Nomus Mar 04 '14 at 12:29
  • As an example of this, the Spring propdeps plugin can be added to the buildscript to enable "provided" and "optional" keywords for dependencies in addition to the usual "compile" and "testCompile" keywords. Note: The war plugin already offers the "provided" keyword, you just need propdeps for jar projects that will be deployed inside a war. – Powerlord Sep 24 '15 at 18:13
30

I want to give you clear conception. For this reason, I am attaching build.grade snapshot code for better understanding.

buildscript dependencies:

buildscript {
    repositories {
        maven { url("https://plugins.gradle.org/m2/") }
    }

    dependencies {
        classpath 'net.saliman:gradle-cobertura-plugin:2.3.2'
        classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
    }
}

root level/core dependencies:

repositories{
    mavenLocal()
    maven { url("https://plugins.gradle.org/m2/") }
    maven { url "https://repo.spring.io/snapshot" }
}

dependencies {
        //Groovy
        compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.3.10'

        //Spock Test
        compile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.3'

        //Test
        testCompile group: 'junit', name: 'junit', version: '4.10'
        testCompile group: 'org.testng', name: 'testng', version: '6.8.5'
}

So, First I want to clarify in single word that

i) buildscript dependencies jar file will be downloaded from buildscript repositories.[Project external dependency]

ii) root level dependencies jar file will be downloaded from root level repositories.[For project dependency]

Here,

The “buildscript” block only controls dependencies for the buildscript process itself, not for the application code. As various gradle plugin like gradle-cobertura-plugin, gradle-lint-plugin are found from buildscript repos. Those plugins would not be referenced as dependencies for the application code.

But for project compilation and test running jar files like groovy all jar, junit and testng jar will be found from root level repositories.

And another thing, maven { url("https://plugins.gradle.org/m2/") } portion can be used in both blocks. Because they are used for different dependencies.

Resource Link: Difference between dependencies within buildscript closure and core

SkyWalker
  • 28,384
  • 14
  • 74
  • 132