弹簧启动和多个外部配置文件

2022-08-31 07:13:37

我有多个要从类路径加载的属性文件。有一个缺省集,其下是 的一部分。我希望文件在类路径上。即/src/main/resourcesmyapp.jarspringcontext

<util:properties id="Job1Props"
    location="classpath:job1.properties"></util:properties>

<util:properties id="Job2Props"
    location="classpath:job2.properties"></util:properties>

我还需要使用外部集覆盖这些属性的选项。我在 中有一个外部配置文件夹。根据弹簧引导文档配置文件夹应该在类路径上。但是从doc中不清楚它是否只会覆盖来自那里或配置中的所有属性。cwdapplication.properties

当我测试它时,只会被拾取,其余的属性仍然从中获取。我已尝试将它们作为逗号分隔列表提供给,但默认集仍未被覆盖。application.properties/src/main/resourcesspring.config.location

如何使多个外部配置文件覆盖默认配置文件?

作为我目前使用的解决方法(特定于应用程序的属性),我通过命令行提供。即app.config.location

java -jar myapp.jar app.config.location=file:./config

我把我的applicationcontext

<util:properties id=“Job1Props” location=“{app.config.location}/job1.properties”></util:properties>

<util:properties id="Job2Props"
    location="{app.config.location}/job2.properties"></util:properties>

这就是我在加载应用程序时在文件和类路径之间进行分离的方式。
编辑:

//pseudo code

if (StringUtils.isBlank(app.config.location)) {
            System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}

我真的不想使用上述解决方法,并让Spring覆盖类路径上的所有外部配置文件,就像它对文件所做的那样。application.properties


答案 1

更新:由于spring.config.location的行为现在覆盖了默认值,而不是添加到它。您需要使用 spring.config.additional-location 来保留默认值。这是从 1.x 到 2.x 的行为更改


使用 Spring Boot 时,将按以下顺序加载属性(请参阅 Spring Boot 参考指南中的外部化配置)。

  1. 命令行参数。
  2. Java System properties (System.getProperties())。
  3. 操作系统环境变量。
  4. 来自 java 的 JNDI 属性:comp/env
  5. 一个 RandomValuePropertySource,它只具有 random.* 中的属性。
  6. 打包 jar 外部的应用程序属性(application.properties,包括 YAML 和配置文件变体)。
  7. 打包在 jar 中的应用程序属性(application.properties,包括 YAML 和配置文件变体)。
  8. @PropertySource@Configuration类的注释。
  9. 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

解析属性时(即 解析按相反的顺序完成(因此从9开始)。@Value("${myprop}")

要添加不同的文件,您可以使用属性,该属性采用逗号分隔的属性文件列表或文件位置(目录)。spring.config.location

-Dspring.config.location=your/config/dir/

上面的那个将添加一个目录,该目录将用于文件。application.properties

-Dspring.config.location=classpath:job1.properties,classpath:job2.properties

这会将 2 属性文件添加到加载的文件中。

默认配置文件和位置在附加指定的配置文件和位置之前加载,这意味着后者将始终覆盖早期配置文件和位置中设置的属性。(另请参阅《弹簧靴参考指南》的此部分)。spring.config.location

如果包含目录(而不是文件),它们应以 / 结尾(并将附加在加载之前生成的名称)。始终使用缺省搜索路径,而不考虑 的值。通过这种方式,您可以为应用程序中的应用程序设置默认值(或您选择的任何其他基名),并在运行时使用其他文件覆盖它,并保留默认值。spring.config.locationspring.config.nameclasspath:,classpath:/config,file:,file:config/spring.config.locationapplication.propertiesspring.config.name


答案 2

使用Spring boot,spring.config.location确实有效,只需提供逗号分隔的属性文件。

请参阅以下代码

@PropertySource(ignoreResourceNotFound=true,value="classpath:jdbc-${spring.profiles.active}.properties")
public class DBConfig{

     @Value("${jdbc.host}")
        private String jdbcHostName;
     }
}

可以将jdbc.properties的默认版本放在应用程序中。外部版本可以设置在这里。

java -jar target/myapp.jar --spring.config.location=classpath:file:///C:/Apps/springtest/jdbc.properties,classpath:file:///C:/Apps/springtest/jdbc-dev.properties

根据使用 spring.profiles.active 属性设置的配置文件值,将选取 jdbc.host 的值。所以当(在窗户上)

set spring.profiles.active=dev

jdbc.host 将从 jdbc-dev.properties 中获取值。

set spring.profiles.active=default

jdbc.host 将从 jdbc.properties 中获取值。


推荐