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
- apply a custom profile to the dependency
- include inheritable settings in the
application-customprofile.properties
- have the dependent(s) set
spring.profiles.include=customprofile
inapplication[-{profile}].properties
(note: if set inapplication.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
, usecommon.properties