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?
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.
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.
To externalize the Spring Boot application.properties when deploying as a war file you can set spring.config.location
at the beginning when Spring Boot application is configured:
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
return springApplicationBuilder
.sources(Application.class)
.properties(getProperties());
}
public static void main(String[] args) {
SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
.sources(Application.class)
.properties(getProperties())
.run(args);
}
static Properties getProperties() {
Properties props = new Properties();
props.put("spring.config.location", "classpath:myapp1/");
return props;
}
For more details check this solution.
You can add configuration files folder to set Classpath line catalina.bat, catalina.sh(which one if you want to use.) or you can add to setenv.bat/sh file. Your config files will be added to war classpath.
For Example;
In Windows env.
set CLASSPATH=D:\app\conf
ReferenceURL : https://stackoverflow.com/questions/29106579/external-configuration-for-spring-boot-application
'programing' 카테고리의 다른 글
How can I toggle a class on click with React? (0) | 2023.02.27 |
---|---|
How to loop an object in React? (0) | 2023.02.27 |
Enzyme - How to access and set value? (0) | 2023.02.27 |
Large scale AngularJS app - multiple UI layouts (0) | 2023.02.27 |
AngularJS에서 중첩된 보기를 설정하려면 어떻게 해야 합니까? (0) | 2023.02.27 |