如何在spring引导中设置外部配置的路径

2guxujil  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(318)

我的问题是关于spring boot(v2.2.x)中配置的另一个问题,但是我的配置结构与现有文章中的配置有一个显著的区别,所以关于配置(即spring boot external config),我有以下应用程序配置:

--src\
     --main\
            --resources\
                -- application.yml
                -- application-local.yml
                -- application-dev.yml
                -- application-prod.yml

我的application-prod.yml看起来像:

spring:
  profiles: 
    active: prod
    include:
      customization

logging:
  level:
    root: INFO
    org.springframework: INFO
    org.hibernate.SQL: INFO
    org.hibernate.type: INFO
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'
    file: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'
  file: ./logs/goals-service.log

我的prod config必须使用(这是一个业务需求)外部配置,设置为
db连接,
安全设置
其他服务的终结点和凭据。
我想使用spring的标准方法和能力来自动配置bean,我不想手动加载一些属性文件并手动配置所有bean。因此,为了解决这个问题,我创建了另一个config application-customization.yml,并通过include将其链接到prod config中(参见上面的示例)。在这里,我遇到了一个问题:我无法通过命令行参数选择application-customization.yml的路径(-dspring.config.location或任何它的变体),但当我将外部配置放在用于启动应用程序的目录中时,我可以加载自定义设置(这是spring搜索配置的行为),在这种情况下,应用程序运行良好。我想传递应用程序应该在哪里搜索我的application-customization.yml的路径,还有一件事我不能使用symlinks from从实际配置位置链接到./application-customization.yml。

xsuvu9jc

xsuvu9jc1#

从应用程序开发中删除“include”,因为我不知道它将如何与我要说的任何东西交互。然后有(至少)两种简单的方法来做你想做的事(也有一些复杂的方法——针对您的情况,甚至大多数情况下的过度杀戮——比如覆盖这个或定义其中一个。)
方式一:传球 -Dspring.config.location=X 对于jvm,其中x是一个逗号分隔的位置列表,其中包含spring应该读取的文件。在你的情况下,你可能想要 -Dspring.config.location=file:/some/folder/,classpath:/ ; 第一个位置将确保您满足业务需求,第二个位置将确保应用程序还读取自己jar中的application-dev.yml。
方式二:放 @PropertySource("file:/some/folder/application.properties") 在一个用 @Configuration (注意 @SpringBootApplication 元注解为 @Configuration ). 这有两个问题:一是 @PropertySource 是最后读取的,其中的属性不覆盖先前读取的属性;第二,有些属性不能用 @PropertySource 文件(因为文件在启动过程中读取得太晚)。我不认为这两个问题会困扰你,但我想为其他读者记下它们。
关于tomcat(可能还有其他容器):使用方式1有点复杂,因为 spring.config.location 是系统属性;它可能需要伪造特定于应用程序的web.xml文件。编辑2020-09-04:或者您可以这样做(特别是代码中的第三个片段,我重复一遍,修改属性名称和值,以防答案消失:

public class ServletInitializer extends SpringBootServletInitializer {

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(MyApplication.class).properties("spring.config.location: /my/config1/,/my/config2/");
        }
}

)... 哪个更好。
这个答案主要是对关于这个问题和相关问题的优秀的官方文献的反刍。

相关问题