spring-boot 应用程序的外部配置

Posted

技术标签:

【中文标题】spring-boot 应用程序的外部配置【英文标题】:External configuration for spring-boot application 【发布时间】:2015-05-20 07:46:01 【问题描述】:

我有一个 spring-boot 应用程序,我想使用外部配置文件运行它。 当我将它作为 jar(带有嵌入式 servlet 容器)运行时,一切都很好。 但我想在外部 servlet 容器(Tomcat)下运行它,在这里我遇到了外部配置问题。我尝试了@PropertySource,但在这种情况下,应用程序只获取war 文件配置中缺少的属性:外部配置不会覆盖内部配置。 那么问题来了:如何配置将覆盖内部配置的外部配置?

【问题讨论】:

【参考方案1】:

您可以将配置文件文件夹添加到 set Classpath 行 catalina.bat、catalina.sh(如果您想使用哪个。)或者您可以添加到 setenv.bat/sh 文件。您的配置文件将被添加到 war 类路径中。

例如;

在 Windows 环境中。

set CLASSPATH=D:\app\conf

【讨论】:

【参考方案2】:

Spring Boot 提供 many ways 来指定属性的位置,无需修改源代码。

你可以定义 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】:

要在部署为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。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 OK @Necreaux 基本部件已添加 @Necreaux 我不明白添加基本部分后的否决票?还缺什么吗? The default search path classpath:,classpath:/config,file:,file:config/ is always used, irrespective of the value of spring.config.location. This search path is ordered from lowest to highest precedence (file:config/ wins). If you do specify your own locations, they take precedence over all of the default locations and use the same lowest to highest precedence ordering. In that way you can set up default values for your application in application.properties (or whatever other basename you choose with spring.config.name) and override it at runtime with a different file, keeping the defaults.【参考方案4】:

当您将应用程序作为 jar 运行时,您可能在当前目录中使用 application.properties 形式的外部配置。但是,在外部 tomcat 中部署为战争时,“当前目录”并不是很有用。即使您知道当前目录是什么,它也很可能是该 tomcat 中运行的所有应用程序的同一位置,因此当您运行多个应用程序时,它不会很好地工作。

我们在这里所做的是在我们的应用程序上声明两个PropertySources

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

internal.properties 包含属性的“内置”默认值。第二个PropertySource 是一个包含外部配置的文件。注意文件名本身是一个属性。

我们在应用程序(在 tomcat 中)的 Context 元素中外部定义:

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

这允许您在 tomcat 中运行多个应用程序,每个应用程序都使用它自己的外部属性文件。您甚至可以让相同应用程序的多个实例以不同的属性运行。

【讨论】:

感谢您的回复。是的,此配置将起作用,正如我在问题中提到的那样,我尝试了此解决方案。该解决方案的缺点是外部配置不会覆盖内部配置。我的问题是如何设置外部配置的优先级? 它应该有效,它对我有用。请注意,我没有使用默认名称 application.properties,它具有不同的优先级。您确定您已经尝试过我的答案吗? 是的,它有效!:) 我已将内部配置名称更改为 internal.properties,它运行良好。有没有办法在运行时重新加载外部配置? 我不知道有什么方法可以做到这一点,也许是另一个问题? 已添加! ***.com/questions/29134315/…

以上是关于spring-boot 应用程序的外部配置的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot - 外部 log4j 配置不起作用

spring-boot中logback日志配置

spring-boot打包,引入外部jar包问题

外部tomcat中的自定义上下文路径

将已有的spring app迁移到spring-boot,手动配置spring-boot?

使用 web.xml 配置 spring-boot 应用程序