Resources and Configuration in Gradle

Introduction

Files under src/main/resources ship inside your JAR on the classpath—application.properties, YAML, XML, and static assets. Gradle copies them via processResources. This chapter shows how to read configs at runtime and how to vary behavior across dev and prod environments with Gradle properties.

Prerequisites

Default Resource Processing

text
src/main/resources/
  application.properties
  config/app.yaml
bash
./gradlew processResources
./gradlew build

Processed files land in build/resources/main/ and inside the JAR.

Read application.properties

src/main/resources/application.properties:

properties
app.name=Hello Gradle
app.version=1.0.0
server.port=8080

src/main/java/com/example/ConfigDemo.java:

Run with application plugin mainClass set to ConfigDemo.

Filter Resources at Build Time

Replace placeholders during processResources:

src/main/resources/build-info.properties:

properties
build.time=@buildTime@
app.env=@appEnv@

build.gradle:

gradle
def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm:ss")
 
processResources {
    filesMatching('build-info.properties') {
        expand(
            buildTime: buildTime,
            appEnv: findProperty('appEnv') ?: 'dev'
        )
    }
}

Build with environment property:

bash
./gradlew build -PappEnv=prod

Expanded file appears in build/resources/main/build-info.properties.

Project gradle.properties

gradle.properties in project root:

properties
org.gradle.jvmargs=-Xmx2g
appEnv=dev
defaultPort=8080

Use in build.gradle:

gradle
def env = findProperty('appEnv') ?: 'dev'
println "Building for env=$env"

User-level overrides: ~/.gradle/gradle.properties.

Command-Line Properties

bash
./gradlew build -PappEnv=staging -PfeatureFlag=true

Access with findProperty('appEnv') or project.property('appEnv') if guaranteed present.

Environment-Specific Source Sets (Pattern)

Optional pattern—extra resources folder per env:

gradle
sourceSets {
    main {
        resources {
            srcDirs 'src/main/resources', "src/main/resources-${findProperty('appEnv') ?: 'dev'}"
        }
    }
}
plaintext
src/main/resources-dev/
src/main/resources-prod/

Pick folders at build time with -PappEnv=prod.

Compare with Maven Profiles

MavenGradle
<profiles> in pom.xml-P properties, flavors, or separate files
src/main/resourcesSame layout
Resource filtering in POMprocessResources { expand }

Gradle has no direct XML profile block—teams use properties, env vars, or build flavors (Android).

Mini Example: Log Active Profile at Startup

java
package com.example;
 
public class App {
 
    public static void main(String[] args) {
        // Pass -DappEnv=prod on JVM or bake via expand
        String env = System.getProperty("app.env", "dev");
        System.out.println("Starting in env: " + env);
    }
}
bash
./gradlew run -Dorg.gradle.jvmargs="-Dapp.env=prod"

Tune JVM args for run task in build.gradle when needed.

FAQ

Resource not found at runtime?

Path is relative to classpath root—no leading / in getResourceAsStream("application.properties").

YAML/XML libraries?

Add SnakeYAML or Jackson to dependencies—Gradle only copies files.

Secrets in properties?

Do not commit production passwords—use env vars or secret managers; .gitignore local override files.

What comes next?

Multi-project builds.