Spring Boot Inherit application.properties from dependency
Asked Answered
S

2

35

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);
    }
}
Spurgeon answered 26/2, 2016 at 23:35 Comment(5)
Not really. I've ended up extracting all common values/properties to a java class with Constants, where values being @Inject 'ed through setters. And that java class is used in underlying projects. Lame, but quick workaround. If I'll find a better way in the future, I'll post it here.Spurgeon
Thanks, so I actually tried what Anton has below and it worked. I have a common props files in a dependency and using the classpath props it looks to work great. Just put the annotation on where your declared your @SpringBootApplicationCourtly
Thanks for you input! Based on your successful experience, I will accept Anton's answer.Spurgeon
#53234281 do you have input for here?Monophonic
How to use profiles in the dependency?Maxey
O
33

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

Owlish answered 16/3, 2016 at 9:31 Comment(3)
Since Java 8 you can omit parent @PropertySources annotationSpurgeon
Do you have input for here #53234281 ?Monophonic
How to use profiles in the dependency?Maxey
L
7

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
Leanto answered 5/4, 2017 at 5:11 Comment(1)
for example java -jar myproject.jar --spring.config.name=myproject docs.spring.io/spring-boot/docs/current/reference/html/…Radioman

© 2022 - 2024 — McMap. All rights reserved.