This plugin allows you to generate *.properties
files for your java projects to be used as a resource.
Many times we need property values to be different based on which environment we are running our application. e.g. On local box all of our external endpoints may point to localhost:8888 while on production they will be like example.something.com
Maintaining multiple property files for the same can be a pain in such cases. And it is very likely that we may miss to add some property in one of our environment specific property files and the hell breaks loose.
Simply add apply plugin: "javaproperties"
in your build.gradle
file.
This adds generateProperties
task to the project.
The property files thus generated are placed in $project.projectDir/src/main/resources
.
To generate application.properties
file we need to keep data-bags in $project.projectDir/conf/data-bags/application
directory.
Multiple *.propeties
may be generated by adding directories in $project.projectDir/conf/data-bags
directory. One for each *.properties
file.
There must be a default.json
present for each property file which defines all the key-value pairs to be rendered in *.properties
file.
Optionally you may have prod.json
, pre-prod.json
etc. one data-bag per environment which simply define key-value pairs to be overridden for that specific environment.
To generate *.properties
for a specific environment simply pass env
gradle property to the task as an argument using -P
.
Lets say that we want to generate application.properties
.
First we create $project.projectDir/conf/data-bags/application
directory and add a default.json
in it.
Default.json
{
"threadPoolSize": 2,
"cronJobTimings": ["0800", "1400"],
"external": {
"url": "localhost:8888"
}
}
Assuming we have added apply plugin: "javaproperties"
in our build.gradle file when we run gradle generateProperties
it will create application.properties
file as follows.
application.properties
threadPoolSize=2
cronJobTimings=0800,1400
external.url=localhost:8888
Notice how array has been converted into comma separated values and nested JSON keys are concatenated.
Using such nesting helps you to group related properties in a clear, concise manner.
Now lets try to generate properties for prod
environment.
First we have to create a prod.json
in $project.projectDir/conf/data-bags/application
.
prod.json
{
"external": {
"url": "some.example.com"
}
}
Now if we run gradle generateProperties -Penv=prod
we get application.properties
as follows.
application.properties
threadPoolSize=2
cronJobTimings=0800,1400
external.url=some.example.com
Notice that only the property which is overriden in prod.json
is changed and other properties remains as is.