我有一个spring-boot应用程序,我想用外部配置文件运行。 当我以jar形式运行它(带有嵌入式servlet容器)时,一切都很好。 但我想在外部servlet容器(Tomcat)下运行它,这里我有外部配置问题。我尝试过@PropertySource,但在这种情况下,应用程序只获取war文件配置中不存在的属性:外部配置不会覆盖内部配置。 所以问题是:如何配置外部配置以覆盖内部配置?
答案 0 :(得分:25)
当您将应用程序作为jar运行时,您可能在当前目录中以application.properties
的形式使用外部配置。但是,当在外部tomcat中部署为战争时,“当前目录”不是很有用。即使您发现当前目录是什么,它很可能是在该tomcat中运行的所有应用程序的相同位置,因此当您运行多个应用程序时,这将无法正常工作。
我们在这里做的是在我们的应用程序中声明两个PropertySources
:
@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})})
internal.properties
包含“内置”默认值。第二个PropertySource
是包含外部配置的文件。请注意文件的名称本身是如何属性。
我们在应用程序的Context
元素中进行外部定义(在tomcat中):
<Context docBase="/path/to/your/war/your.war">
<Parameter name="application.properties" value="/path/to/your/properties/application.properties"/>
</Context>
这允许您在tomcat中运行多个应用程序,每个应用程序使用它自己的外部属性文件。您甚至可以使用不同属性运行相同应用程序的多个实例。
答案 1 :(得分:17)
要在部署为war文件时外部化Spring Boot application.properties,可以在配置Spring Boot应用程序时在开头设置spring.config.location
:
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;
}
有关详细信息,请查看此solution。
答案 2 :(得分:15)
Spring Boot商品many ways用于指定商品的位置,不需要修改商家信息。
Yo可以定义 spring.config.location 值,例如:
在tomcat/conf/Catalina/<host>
上下文描述符中:
<Context>
<Parameter name="spring.config.location" value="/path/to/application.properties" />
</Context>
作为tomcat setenv.sh
文件中的JVM参数:
-Dspring.config.location=/path/to/application.properties
作为SPRING_CONFIG_LOCATION
环境变量。
答案 3 :(得分:0)
您可以将配置文件文件夹添加到 set Classpath 行catalina.bat,catalina.sh(如果要使用的话,可以选择该行),也可以添加到setenv.bat / sh文件中。您的配置文件将被添加到war classpath。
例如;
在Windows环境中。
set CLASSPATH=D:\app\conf