当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot中设置外部配置路径

董元徽
2023-03-14
--src\
     --main\
            --resources\
                -- application.yml
                -- application-local.yml
                -- application-dev.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
    null

我希望使用标准的方法和spring的能力来自动配置bean,我不希望手动加载一些属性文件和手动配置所有bean。因此,为了解决这个问题,我创建了另一个配置应用程序--Customization.yml,并通过include将其链接到prod config中(参见上面的示例)。在这里我遇到了一个问题:我无法通过命令行参数(-dspring.config.location或任何it变体)选择application-customization.yml的路径,但是当我将外部配置放置在用于启动app的目录中时,我可以加载自定义设置(这是spring搜索配置的一种行为),在这种情况下app可以正常工作。我想传递应用程序应该在哪里搜索我的application-customization.yml的路径,还有一件事我不能使用符号链接从实际配置位置链接到./application-customization.yml。

共有1个答案

寿卜鹰
2023-03-14

从应用程序开发中删除“include”,因为我不知道它将如何与我将要说的任何内容交互。然后有(至少)两种简单的方法来做你想做的事情。(也有一些复杂的方法--对于您的情况,甚至大多数情况来说都是矫枉过正的--比如重写这个或者定义其中的一个。)

方法1:将-dspring.config.location=X传递给JVM,其中X是一个逗号分隔的位置列表,包含Spring应该读取的文件。在您的示例中,您可能需要-dspring.config.location=file:/some/folder/,classpath:/;第一个位置将确保您满足您的业务需求,第二个位置将确保应用程序也读取它自己的jar中的application-dev.yml。

方法2:将@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/");
        }
}

)...哪个更好。

这一答复基本上是对关于这一问题和有关问题的出色的正式文件的重复。

 类似资料:
  • 在springboot应用程序中,我有一个jar,然后是一个子目录config with application。属性,applicationContext。xml和log4j。。。属性文件。 我正在尝试外部化log4j配置。application.properties是这样外部化的。 但是,当springboot运行时,它使用jar文件中的log4j配置文件。通过使用-Dlog4j.debug选

  • 我很困惑如何为外部配置设置位置, 基于https://docs.spring.io/spring-boot/docs/1.2.2.release/reference/html/boot-features-external-config.html我进行了一些外部配置,但失败了,下面是我的代码

  • 我在学习Spring Boot时遇到了一些编码问题;我想添加一个像Spring3.x那样的CharacterEncodingFilter。就像这样:

  • 我想避免对象达到的最大对象图大小:840-错误。按照这个 此元素具有以下属性:maxDepth–控制在引擎大小采取任何操作之前可以访问多少链接对象。此属性是必需的。MaxDepthexceedBehavior–指定在调整对象图大小时超过最大深度时发生的情况: 这怎么能在ehcache3和springboot中设定。使用编程配置。我没有在ehcache 3.4的springboot中使用xml

  • 我想外部化的选项,有一个可重用的类或注释,我可以扔在排除任何数据库/Hibernate初始化。 因此,与其写: 我想创建一个注释,我可以应用到我的主类: 然后通过注释启用此功能: 问题:注释方法不起作用,Spring仍然尝试加载数据库。为什么啊? 我的最终目标是拥有多个配置文件,其中只有一个加载数据库。

  • 我正在开发一个由几个包组成的OSGi程序,我有时在本地windows dev计算机上运行,有时在经典的Linux上运行。目前,几个专用于资源连接的bundle都有自己的配置文件(属性文件),其中包含一些信息,比如访问一些重要文件的路径(在两个环境中都有)。 但是,由于两个执行环境中的路径不同,我必须在编译之前手动更改配置,这取决于我要在哪个环境中运行我的程序。