# Create and Use of multiple application.properties files

# Dev and Prod environment using different datasources

After succesfully setup Spring-Boot application all the configuration is handled in an application.properties file. You will find the file at src/main/resources/.

Normally there is a need to have a database behind the application. For development its good to have a setup of dev and a prod environments. Using multiple application.properties files you can tell Spring-Boot with which environment the application should start.

A good example is to configure two databases. One for dev and one for productive.

For the dev environment you can use an in-memory database like H2. Create a new file in src/main/resources/ directory named application-dev.properties. Inside the file there is the configuration of the in-memory database:

spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

For the prod environment we will connect to a "real" database for example postgreSQL. Create a new file in src/main/resources/ directory named application-prod.properties. Inside the file there is the configuration of the postgreSQL database:

spring.datasource.url= jdbc:postgresql://localhost:5432/yourDB
spring.datasource.username=postgres
spring.datasource.password=secret

In your default application.properties file you are now able to set which profile is activated and used by Spring-Boot. Just set one attribute inside:

spring.profiles.active=dev

or

spring.profiles.active=prod

Important is that the part after - in application-dev.properties is the identifier of the file.

Now you are able to start Spring-Boot application in develop or production mode by just changing the identifier. An in-Memory database will startup or the connection to a "real" database. Sure there are also much more use cases to have multiple property files.

# Set the right spring-profile by building the application automatically (maven)

By creating multiple properties files for the different environments or use cases, its sometimes hard to manually change the active.profile value to the right one. But there is a way to set the active.profile in the application.properties file while building the application by using maven-profiles.

Let's say there are three environments property files in our application:

application-dev.properties:

spring.profiles.active=dev
server.port=8081

application-test.properties:

spring.profiles.active=test
server.port=8082

application-prod.properties.

spring.profiles.active=prod
server.port=8083

Those three files just differ in port and active profile name.

In the main application.properties file we set our spring profile using a maven variable:

application.properties.

spring.profiles.active=@profileActive@

After that we just have to add the maven profiles in our pom.xml We will set profiles for all three environments:


<profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <build.profile.id>dev</build.profile.id>
                <profileActive>dev</profileActive>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <build.profile.id>test</build.profile.id>
                <profileActive>test</profileActive>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <build.profile.id>prod</build.profile.id>
                <profileActive>prod</profileActive>
            </properties>
        </profile>
    </profiles>

You are now able to build the application with maven. If you dont set any maven profile, its building the default one (in this example it's dev). For specify one you have to use a maven keyword. The keyword to set a profile in maven is -P directly followed by the name of the profile: mvn clean install -Ptest.

Now, you are also able to create custom builds and save those in your IDE for faster builds.

Examples:

mvn clean install -Ptest


 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.3.RELEASE)

2017-06-06 11:24:44.885  INFO 6328 --- [           main] com.demo.SpringBlobApplicationTests      : Starting SpringApplicationTests on KB242 with PID 6328 (started by me in C:\DATA\Workspaces\spring-demo)
2017-06-06 11:24:44.886  INFO 6328 --- [           main] com.demo.SpringApplicationTests      : The following profiles are active: test

mvn clean install -Pprod


 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.3.RELEASE)

2017-06-06 14:43:31.067  INFO 6932 --- [           main] com.demo.SpringBlobApplicationTests      : Starting SpringApplicationTests on KB242 with PID 6328 (started by me in C:\DATA\Workspaces\spring-demo)
2017-06-06 14:43:31.069  INFO 6932 --- [           main] com.demo.SpringApplicationTests      : The following profiles are active: prod