Gradle Goodness: Create Properties File With WriteProperties Task
If we need to create a Java properties file in our build we could create a custom task and use the Properties
class to store a file with properties. Instead of writing our custom task we can use the task WriteProperties
that is already part of Gradle. Using this task Gradle will not add a timestamp in the comment to the properties file. Also the properties are sorted by name, so we know the properties are always in the same order in the output file. Finally, a fixed line separator is used, which is \n
by default, but can be set via the task property lineSeparator
.
To define the properties that need to be in the output file we can use the property
method for a single property, or we can use properties
method with a Map
argument to set multiple properties.
In the following build file we define a new task projectProps
of task type WriteProperties
and we use task output as dependency for the processResources
task. This way our new task will be executed, if there are changes, when the processResources
task is executed:
// File: build.gradle.kts
plugins {
java
}
version = "1.0.0"
tasks {
val projectProps by registering(WriteProperties::class) {
description = "Write project properties in a file."
// Set output file to build/project.properties
outputFile = file("${buildDir}/project.properties")
// Default encoding is ISO-8559-1, here we change it.
encoding = "UTF-8"
// Optionally we can specify the header comment.
comment = "Version and name of project"
// Define property.
property("project.version", project.version)
// Define properties using a Map.
properties(mapOf("project.name" to project.name))
}
processResources {
// Depend on output of the task to create properties,
// so the properties file will be part of the Java resources.
from(projectProps)
}
}
When we invoke the classes
task we can see that our new task is executed:
$ gradle --console plain classes
> Task :compileJava UP-TO-DATE
> Task :projectProps
> Task :processResources
> Task :classes
BUILD SUCCESSFUL in 1s
3 actionable tasks: 2 executed, 1 up-to-date
$ cat build/project.properties
#Version and name of project
project.name=write-properties-sample
project.version=1.0.2
Without any changes we see our task was up-to-date and doesn’t have to run:
$ gradle --console plain classes
> Task :compileJava UP-TO-DATE
> Task :projectProps UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
BUILD SUCCESSFUL in 596ms
3 actionable tasks: 3 up-to-date
Written with Gradle 6.8.3