Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

External configuration for spring-boot application

I have a spring-boot application which I want to run with external configuration file. When I run it as jar (with embedded servlet container), everything is fine. But I want to run it under external servlet container (Tomcat) and here i have problem with external configuration. I have tried a @PropertySource, but in this case application gets only properties absent in war file configuration: external configuration doesn't override internal configuration. So the question: how can I configure external configuration which will override internal configuration?

like image 935
Aram Aslanyan Avatar asked Mar 17 '15 18:03

Aram Aslanyan


People also ask

What are the possible sources of external configuration?

This way, a configuration can be provided from different sources, for example, file systems, the internet, external services, configuration services, vaults, etc.


2 Answers

You're probably using external configuration in the form of application.properties in the current directory when you're running your application as a jar. However, "current directory" isn't very useful when deploying as a war in an external tomcat. Even if you find out what the current directory is, it's most likely the same location for all applications running in that tomcat, so when you're running more than one application, that's not going to work very well.

What we do here is this declare two PropertySources on our application:

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})}) 

internal.properties contains "built in" default values for propeties. The second PropertySource is a file containing external configuration. Note how the name of the file is itself a property.

We define this externally in the Context element of our application (in tomcat):

<Context docBase="/path/to/your/war/your.war">     <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/> </Context> 

This allows you to have multiple applications running in tomcat, each application using it's own external properties file. You can even have multiple instances of the same application running with different properties.

like image 158
ci_ Avatar answered Oct 10 '22 23:10

ci_


Spring Boot offer many ways to specify the location of your properties, it´s not needed to modify your sources.

Yo can define the spring.config.location value for example:

  • In your tomcat/conf/Catalina/<host> context descriptors:

    <Context>     <Parameter name="spring.config.location" value="/path/to/application.properties" /> </Context> 
  • As a JVM parameter in your tomcat setenv.sh file:

    -Dspring.config.location=/path/to/application.properties 
  • As a SPRING_CONFIG_LOCATION environment variable.

like image 42
Rafael Membrives Avatar answered Oct 10 '22 23:10

Rafael Membrives