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
src/main/resources/
application.properties
config/app.yaml./gradlew processResources
./gradlew buildProcessed files land in build/resources/main/ and inside the JAR.
Read application.properties
src/main/resources/application.properties:
app.name=Hello Gradle
app.version=1.0.0
server.port=8080src/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:
build.time=@buildTime@
app.env=@appEnv@build.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:
./gradlew build -PappEnv=prodExpanded file appears in build/resources/main/build-info.properties.
Project gradle.properties
gradle.properties in project root:
org.gradle.jvmargs=-Xmx2g
appEnv=dev
defaultPort=8080Use in build.gradle:
def env = findProperty('appEnv') ?: 'dev'
println "Building for env=$env"User-level overrides: ~/.gradle/gradle.properties.
Command-Line Properties
./gradlew build -PappEnv=staging -PfeatureFlag=trueAccess with findProperty('appEnv') or project.property('appEnv') if guaranteed present.
Environment-Specific Source Sets (Pattern)
Optional pattern—extra resources folder per env:
sourceSets {
main {
resources {
srcDirs 'src/main/resources', "src/main/resources-${findProperty('appEnv') ?: 'dev'}"
}
}
}src/main/resources-dev/
src/main/resources-prod/Pick folders at build time with -PappEnv=prod.
Compare with Maven Profiles
| Maven | Gradle |
|---|---|
<profiles> in pom.xml | -P properties, flavors, or separate files |
src/main/resources | Same layout |
| Resource filtering in POM | processResources { expand } |
Gradle has no direct XML profile block—teams use properties, env vars, or build flavors (Android).
Mini Example: Log Active Profile at Startup
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);
}
}./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.