我正在构建多个Spring Boot应用程序,这些应用程序将部署在同一servlet容器中。但是我很难让Spring Boot以我想要的方式而不是框架想要的方式与外部化的配置文件一起工作。
情况:
spring.config.location
问题:
由于将应用程序部署在同一JVM上,因此该属性spring.config.location对于所有应用程序都具有相同的值。我希望我们的所有应用程序都使用相同的配置文件命名(application.properties),所以指定spring.config.name不是选项。
spring.config.name
我想要的是:
$ {spring.config.location} /app1/application.properties $ {spring.config.location} /app2/application.properties $ {spring.config.location} /app3/application.properties
是否有某种机制可以影响或覆盖外部配置文件的加载或解析?
还有其他方法来获得预期的结果吗?
@Iulian Rosca建议使用像这样的模式,这${properties_home}/${application_id}/application.properties使我想到了定义像这样的自定义JVM属性的想法,app.config.root并使用此属性spring.config.location在应用程序生命周期的早期覆盖了它。
${properties_home}/${application_id}/application.properties
app.config.root
我的应用程序类现在看起来像这样,并适用于嵌入式和容器部署:
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return configureApplication(builder); } public static void main(String[] args) { configureApplication(new SpringApplicationBuilder()).run(args); } private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) { return builder .sources(Application.class) .properties("spring.config.location:${${app.config.root}/myapp1/:#{null}}"); } }
此解决方案的重要说明:
SpringApplicationBuilder.properties(...)