为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot和多个外部配置文件

/ 猿问

Spring Boot和多个外部配置文件

烧仙草VB 2019-10-25 09:36:53

我有多个要从类路径加载的属性文件。有一个默认设置,/src/main/resources它是的一部分myapp.jar。我springcontext希望文件位于类路径中。即


<util:properties id="Job1Props"

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


<util:properties id="Job2Props"

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

我还需要使用外部集覆盖这些属性的选项。我在中有一个外部配置文件夹cwd。按照spring boot doc config文件夹应该在classpath上。但是从doc尚不清楚,它是否只会覆盖applicaiton.propertiesfrom或配置中的所有属性。


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


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


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


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

我改变了我的applicationcontext给


<util:properties id="Job2Props"

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

这就是我在加载应用程序时如何在文件和类路径之间进行分隔的方法。

编辑:


//psuedo code


if (StringUtils.isBlank(app.config.location)) {

            System.setProperty(APP_CONFIG_LOCATION, "classpath:");

}

我真的不希望使用上述变通方法,并且让spring像在application.properties文件路径上那样覆盖classpath上的所有外部配置文件。


查看完整描述

3 回答

?
手掌心

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


命令行参数。

Java系统属性(System.getProperties())。

操作系统环境变量。

来自java:comp / env的JNDI属性

一个RandomValuePropertySource,仅具有random。*属性。

打包jar之外的应用程序属性(application.properties,包括YAML和配置文件变体)。

打包在jar中的应用程序属性(包括YAML和配置文件变体的application.properties)。

@Configuration类上的@PropertySource批注。

默认属性(使用SpringApplication.setDefaultProperties指定)。

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


要添加其他文件,您可以使用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 Boot参考指南》的本节)。


如果spring.config.location包含目录(而不是文件),则目录应以/结尾(并spring.config.name在加载后附加从生成的名称)。classpath:,classpath:/config,file:,file:config/始终使用默认搜索路径,而与的值无关spring.config.location。这样,您可以在中设置应用程序的默认值application.properties(或使用来选择的其他任何基本名称spring.config.name),并在运行时使用其他文件覆盖它,并保持默认值。


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


查看完整回答
反对 回复 2019-10-25
?
MM们

使用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的值。因此,当(在Windows上)


set spring.profiles.active=dev

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


对于


set spring.profiles.active=default

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


查看完整回答
反对 回复 2019-10-25
?
慕仰8121524

看一下PropertyPlaceholderConfigurer,我发现它比注解更清晰易用。


例如


@Configuration

public class PropertiesConfiguration {



    @Bean

    public PropertyPlaceholderConfigurer properties() {

        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();

//        ppc.setIgnoreUnresolvablePlaceholders(true);

        ppc.setIgnoreResourceNotFound(true);


        final List<Resource> resourceLst = new ArrayList<Resource>();


        resourceLst.add(new ClassPathResource("myapp_base.properties"));

        resourceLst.add(new FileSystemResource("/etc/myapp/overriding.propertie"));

        resourceLst.add(new ClassPathResource("myapp_test.properties"));

        resourceLst.add(new ClassPathResource("myapp_developer_overrides.properties")); // for Developer debugging.


        ppc.setLocations(resourceLst.toArray(new Resource[]{}));


        return ppc;

    }


查看完整回答
反对 回复 2019-10-25

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信