Spring Boot Inherit application.properties from dependency

Let's say I have 5 Spring Boot Projects. All of them have a Maven dependency on a Spring Boot project No 6 with some shared/common classes. 5 independent projects have a lot of common properties assigned at each application.properties, which I'd like to abstract and move them to common project. Overall it looks like this:

                                            Project 1 (app.properties)
Common Project (app-common.properties) <--- Project 2 (app.properties)
                                            Project 3 (app.properties)...

Current problem is that app-common.properties is inside project1.jar/lib/common-project.jar and app-common.properties apparently do not load upon startup.

Is there a way to extend it from a dependency?

CommonProject Main class looks like this:

@SpringBootApplication
public class CommonApplication extends SpringBootServletInitializer {

    protected static void run(SpringApplication application, String[] args) {
        application.run(args);
    }
}

Project1 Main class looks like this:

public class Project1 extends CommonApplication {

    public static void main(String[] args) {
        run(new SpringApplication(Project1.class), args);
    }
}

Solution 1:

Use PropertySource annotation and provide two sources for your app:

@PropertySources({
        @PropertySource("classpath:app-common.properties"),
        @PropertySource("classpath:app.properties")
    })

more details can be found there https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Solution 2:

Currently spring boot doesn't provide inheriting properties.

A spring boot application supports multiple property sources but the convention (read: built-in logic) for xxx.properties is to resolve the last xxx.properties if there are multiple properties files having the same file name.

There are many solution to this.

One possible solution is to

  1. apply a custom profile to the dependency
  2. include inheritable settings in the application-customprofile.properties
  3. have the dependent(s) set spring.profiles.include=customprofile in application[-{profile}].properties (note: if set in application.properties, it applies for all profiles)

Another possible solution is to use a unique custom filename for the properties.

  • i.e. instead of using the default application.properties, use common.properties