Springboot引用外部配置文件

项目经理提出配置文件与工程jar包分离需求,避免重复打包。最初考虑SpringCloudConfig方案被拒,后尝试通过启动命令动态引入配置文件。介绍了四种将配置文件放外部的方式及优先级,还探讨了多配置文件生效和修改配置不重启项目的方法,最后提出配置写入文件未生效的疑问。

昨天项目经理提出一个需求,想要实现配置文件和工程jar包分离,方便去客户现场部署环境时,避免每次都把jar解压修改后,再重新打包的麻烦。
开始脑子里想到的方案,是使用SpringCloudConfig配置服务器完成。自己也搭建了demo环境,但给项目经理展示的时候,被拒。原因:这样需要单独维护一个新的工程,且还需要维护一个git服务。这个方案可行,但不太适用。
后来想到的是通过java代码读取外边某个路径下的文件,但是开始做之后发现好多问题。后来再网上看了一个博客就发现这样一种方案。(版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/qq_35981283/article/details/77583073 )

通过启动命令动态引入配置文件:

java -jar demo.jar --Dspring.config.location=myapplication.properties

这样就可以通过@value注解读取myapplication.properties中的配置信息了。(上边的大写D好像可以不写的)

后来想着直接把spring.config.location写到application.properties配置文件中,然后指定一个固定的外部配置文件来获取信息,这样启动的时候就可以不用加最后一行了。

spring.config.location=C:\\Users\\Administrator\\git\\Display\\host.properties

可是这种方式是行不通的,比如我配置文件中有下面信息:

myname=hellopangkunkun

代码:

    @Value("${myname}")
    private String name;

我在启动的时候直接报这个地方的错误,说是无法找到myname,导致整个项目出异常。

后来搜了下文章,对比官网文档,又得到了一些信息:

24.3 Application property files
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:

A /config subdirectory of the current directory.
The current directory
A classpath /config package
The classpath root
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).

这里说了四种方式可以把配置文件放到外部的。
第一种是在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下;
第二种是直接把配置文件放到jar包的同级目录;
第三种在classpath下建一个config文件夹,然后把配置文件放进去;
第四种是在classpath下直接放配置文件。

这四种方式的优先级是从一到四一次降低的。

注: 一二两种方案其实不是jar包的同级目录,而是(执行启动指令的)同级目录。为了便于理解我把上面的当前目录说成jar包的同级目录,这种说法并不对。如果是刚开始接触或者调试这块,还是在jar包同级目录方便。

由于我们是要从外部读取文件,所以直接说前两种。

看下文件目录结构:


11464886-d2692205eb8667f9

这里的application.properties是我们的配置文件,config是创建的另外一个目录,放的也是application.properties。

Display-1.0-SNAPSHOT.jar中可以包含application.properties配置文件也可以不包含。

为了验证可以在config中设置myname=name1,jar同级目录中设置myname=name2,如果jar中包含配置文件,将其中设置成myname=name3。

直接使用指令启动:

java -jar Display-1.0-SNAPSHOT.jar

之后验证可得知,我们通过@Value(“${myname}”)获取到的myname的值是name1,把config下的配置文件删除后获取的结果是name2,都删除后才会获取jar包中配置文件的数据name3。

另外如果我们想要想配置测试、开发、生产环境一样使用另外一个配置文件怎么来实现呢?

下面继续,我把application.properties的信息修改如下:

spring.profiles.active=dev,host

配置文件目录结构:


11464886-79239be68f6b3275
这里写图片描述

我又新增了一个名为application-host.properties的配置文件,同理也可以把这个文件考出来放到jar包外面,同级目录或者config下。

这样项目启动之后dev配置文件和host配置文件都会生效。


11464886-c0c7963bc115d200
这里写图片描述

这里为了突出其他的配置文件我只把host的拷出来了,dev的还是在jar包里,application.properties配置文件放在jar中也一样,我们需要的主要是host的配置文件。

这样每次修改的时候只需要修改配置文件信息,然后重启项目就好,不需要重新打包。

如果想要只修改配置文件,不重启项目就能生效,可以考虑用java来读取配置文件中的数据,把它当作一个普通文件来读取,或者写到其他数据库中也行。上面这些方案已经能够满足我的需求了,所以其他的不在做了。

最后提个问题,也是我没弄明白的,希望知道的各位能够给个答案:

我把spring.config.location这个配置写到配置文件中为什么没有生效?

Spring Boot中,可以使用@PropertySource注解来引用外部配置文件。 首先,在你的Spring Boot应用的主配置文件(通常是application.properties或application.yml)中添加以下配置: ``` spring.config.name=application spring.config.location=classpath:/config/ ``` 这个配置告诉Spring Boot去查找名为application的配置文件,并将其位置设定为classpath:/config/,也就是在项目的src/main/resources目录下的config文件夹中。 接下来,在你的Spring Boot应用的启动类中,使用@PropertySource注解来引用外部配置文件。例如,如果你想引用一个名为custom.properties的配置文件,可以在启动类上添加@PropertySource注解: ``` @SpringBootApplication @PropertySource("classpath:/config/custom.properties") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 然后,你就可以在应用中使用@Value注解来注入配置文件中的属性值了。例如,如果你的custom.properties文件中有一个属性名为custom.message,你可以在你的Spring Bean中使用@Value注解来注入这个值: ``` @Component public class YourBean { @Value("${custom.message}") private String message; // ... } ``` 这样,Spring Boot就会将配置文件中的custom.message属性值注入到YourBean的message属性中。 总结起来,只需要在主配置文件中配置外部配置文件的位置,然后使用@PropertySource注解来引用外部配置文件,最后使用@Value注解来注入配置文件中的属性值即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值