How do I define a variable for the dependency version in Gradle

I am currently trying to migrate a Maven project to Gradle

In my Maven version I have the dependency versions all listed out like this in my parent pom:

<properties>
    <spring.version>4.2.3.RELEASE</spring.version>
    <spring.boot.version>1.3.3.RELEASE</spring.boot.version>
    ...
</properties>

And then I can define a dependency like this in any of my sub-modules:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

I am attempting to do the same thing on Gradle, because some of my modules share dependency versions like this, and I wouldn't like to modify more then one place if I want to upgrade Spring or do a similar operation.

The closest I have gotten to it is this:

dependencies {
    ext.springVersion = '4.2.3.RELEASE'
    compile "org.springframework:spring-jdbc:$springVersion"
}

Yet that still doesn't work. What is the recommended way to achieve this in Gradle? Or does Gradle treat this differently? Perhaps my mind is still too much on Maven to see another solution.

Please keep in mind that that attempt on Gradle isn't exactly what I want yet. I would like to be able to define the dependencies in a separate file, not directly on the file that will use it.


Below configuration in build.gradle file worked for me with gradle version 4.5, posting it here for future reference -

ext {
    springVersion = '5.0.3.RELEASE'
}

dependencies {
    compile  "org.springframework:spring-context:$springVersion"
}

Use Double Quotes it worked for me.

buildscript {
    ext {
        springBootVersion = '2.0.4.RELEASE'
        hazelCastVersion = '3.10.4'
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

    }
}

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile "com.hazelcast:hazelcast-spring:${hazelCastVersion}"
    compile group: 'com.hazelcast', name: 'hazelcast', version: "${hazelCastVersion}" }

The way you've provided dependency version is correct and should work. IntelliJ Idea has some troubles with variables within gradle build scripts, so you don't have to rely on it, just try to run your build and check out, whether is dependency downloaded and your project is build correctly.

If you wish to store your project dependencies in the separate file, then the most common approach is to define them in the root build.script, via subprojects closure for all subprojects or via allprojects if you wish to specify dependency for all your projects include the root. This will look like this:

subprojects{
    dependencies{
        compile ...
    }
}

This way you can provide any common configuration for subprojects within the root build script. Read about it the user guide

Or you can declare a variable in the root build script, initialize it as an map with all the dependency specifications you need or as an array with single dependencies list and use this variable within your subprojects, if you need them. Somethin like this in the root:

ext.commomLibs = [
  'testlibs' : 'junit:junit:4.8'
]

Note, you can define a value of the map as an array of the lib specification to make it pointing to all this dependencies. And then you can use it in your subprojects as:

dependencies{
    testCompile commomLibs.testlibs
}

One more alternative is to use separate build script with dependencies and apply it to the buils script you need, like so

apply from: 'dependencies.script'

Then you can place your dependencies into dependencies script and just apply it in any other build script, where you need this dependenies and/or may be some common logic.


You can use now even more close to the dependencies in the App Gradle Build as shown below:

dependencies {
    def daggerVersion = "2.24"
    implementation "com.google.dagger:dagger:$daggerVersion"
    annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}