How to read a properties files and use the values in project Gradle script?


Java Problem Overview

I am working on a Gradle script where I need to read the file and use the values in the properties file in build.gradle. I am doing it in the below manner. I ran the below script and it is now throwing an error, but it is also not doing anything like creating, deleting, and copying the file. I tried to print the value of the variable and it is showing the correct value.

Can someone let me know if this is the correct way to do this? I think the other way is to define everything in the and use it in the build.gradle. Can someone let me know how could I access the properties in build.gradle from

build.gradle file:

apply plugin: 'java'

// Set the group for publishing
group = 'com.true.test'

 * Initializing GAVC settings
def buildProperties = new Properties()
file("").withInputStream {
        stream -> buildProperties.load(stream)
// If jenkins build, add the jenkins build version to the version. Else add snapshot version to the version.
def env = System.getenv()
if (env["BUILD_NUMBER"]) buildProperties.test+= ".${env["BUILD_NUMBER"]}"
version = buildProperties.test
println "${version}"

// Name is set in the settings.gradle file
group = "com.true.test"
version = buildProperties.test
println "Building ${}:${}:${project.version}"

Properties properties = new Properties()
def folderDir = properties.getProperty('build.dir')
def configDir = properties.getProperty('config.dir')
def baseDir  = properties.getProperty('base.dir')
def logDir  = properties.getProperty('log.dir')
def deployDir  = properties.getProperty('deploy.dir')
def testsDir  = properties.getProperty('tests.dir')
def packageDir  = properties.getProperty('package.dir')
def wrapperDir  = properties.getProperty('wrapper.dir')

sourceCompatibility = 1.7
compileJava.options.encoding = 'UTF-8'

repositories {
     maven { url "http://arti.oven.c:9000/release" }

task swipe(type: Delete) {
         println "Delete $projectDir/${folderDir}"
         delete "$projectDir/$folderDir"
	     delete "$projectDir/$logDir"
         delete "$projectDir/$deployDir"
	     delete "$projectDir/$packageDir"
	     delete "$projectDir/$testsDir"
task prepConfigs(type: Copy, overwrite:true, dependsOn: swipe) {
    println "The name of ${projectDir}/${folderDir} and ${projectDir}/${configDir}"
} file:

# -----------------------------------------------------------------
# General Settings
# -----------------------------------------------------------------  = Admin = Hello Cool

# -----------------------------------------------------------------
# ant build directories
# -----------------------------------------------------------------
sandbox.dir = ${projectDir}/../..
ant.dir = ${projectDir}/ant
build.dir = ${ant.dir}/build
log.dir  = ${ant.dir}/logs
config.dir = ${ant.dir}/configs
deploy.dir  = ${ant.dir}/deploy
static.dir =  ${ant.dir}/static
package.dir = ${ant.dir}/package
tests.dir = ${ant.dir}/tests
tests.logs.dir = ${tests.dir}/logs
external.dir = ${sandbox.dir}/FlexCommon/External
external.lib.dir = ${external.dir}/libs

Java Solutions

Solution 1 - Java

If using the default file, you can access the properties directly from within your build.gradle file:

projectName=Hello Cool


task printProps {
    doFirst {
        println applicationName
        println projectName

If you need to access a custom file, or access properties which include . in them (as it appears you need to do), you can do the following in your build.gradle file:

def props = new Properties()
file("").withInputStream { props.load(it) }

task printProps {
    doFirst {
        println props.getProperty("")
        println props.getProperty("")

Take a look at this section of the Gradle documentation for more information.


If you'd like to dynamically set up some of these properties (as mentioned in a comment below), you can create a properties.gradle file (the name isn't important) and require it in your build.gradle script.


ext {
    subPath = "some/sub/directory"
    fullPath = "$projectDir/$subPath"


apply from: 'properties.gradle'

// prints the full expanded path
println fullPath

Solution 2 - Java

We can use a separate file (config.groovy in my case) to abstract out all the configuration.

In this example, we're using three environments viz.,

  1. dev
  2. test
  3. prod

which has properties serverName, serverPort and resources. Here we're expecting that the third property resources may be same in multiple environments and so we've abstracted out that logic and overridden in the specific environment wherever necessary:


resources {
    serverName = 'localhost'
    serverPort = '8090'
environments {
    dev {
        serverName = 'http://localhost'   
		serverPort = '8080'
    test {
        serverName = ''
		serverPort = '5211'
        resources {
            serverName = ''
    prod {
        serverName = ''
		serverPort = '80'
        resources {
			serverName = ''
			serverPort = '80'

Once the properties file is ready, we can use the following in build.gradle to load these settings:


def loadProperties() {
    def environment = hasProperty('env') ? env : 'dev'
    println "Current Environment: " + environment
    def configFile = file('config.groovy')
    def config = new ConfigSlurper(environment).parse(configFile.toURL())
    project.ext.config = config

task printProperties {
    println "serverName:  $config.serverName"
    println "serverPort:  $config.serverPort"
    println "resources.serverName:  $config.resources.serverName"
    println "resources.serverPort:  $config.resources.serverPort"

Let's run these with different set of inputs:

  1. gradle -q printProperties

    Current Environment: dev
    serverName:  http://localhost
    serverPort:  8080
    resources.serverName:  localhost
    resources.serverPort:  8090
  2. gradle -q -Penv=dev printProperties

    Current Environment: dev
    serverName:  http://localhost
    serverPort:  8080
    resources.serverName:  localhost
    resources.serverPort:  8090
  3. gradle -q -Penv=test printProperties

    Current Environment: test
    serverPort:  5211
    resources.serverPort:  8090
  4. gradle -q -Penv=prod printProperties

    Current Environment: prod
    serverPort:  80
    resources.serverPort:  80

Solution 3 - Java

Another way... in build.gradle:

Add :

classpath 'org.flywaydb:flyway-gradle-plugin:3.1'

And this :

def props = new Properties()
file("src/main/resources/").withInputStream { props.load(it) }
apply plugin: 'flyway'
flyway {
    url = props.getProperty("spring.datasource.url")
    user = props.getProperty("spring.datasource.username")
    password = props.getProperty("spring.datasource.password")
    schemas = ['db_example']

Solution 4 - Java

This is for Kotlin DSL (build.gradle.kts):

import java.util.*
// ...

val properties = Properties().apply {
val prop = properties["myPropName"]

In Android projects (when applying the android plugin) you can also do this:

// ...

val properties = gradleLocalProperties(rootDir)
val prop = properties["propName"]


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionunknownView Question on Stackoverflow
Solution 1 - JavablacktideView Answer on Stackoverflow
Solution 2 - JavaRaman SahasiView Answer on Stackoverflow
Solution 3 - JavaLucas Moyano AngeliniView Answer on Stackoverflow
Solution 4 - JavaMahozadView Answer on Stackoverflow