问题并不难,解决方案也有很多,所以我决定写一篇文章来详细谈谈这个问题。
首先朋友们应该明白,Boot默认加载的配置文件是. 或 .yaml。 默认加载位置有五个,可以分为两类:
从下载来看,这又细分为两种:
直接读取下面的配置文件,对应Boot工程,就是该目录下的配置。
读取://目录下的文件,对应Boot工程中/目录下的配置。
这两种情况如下:
从项目所在的当前目录加载,这又细分为三种情况:
从项目的当前目录加载配置文件。
从项目当前目录下的文件夹加载配置文件。
从项目当前目录下的文件夹的子文件夹加载(不允许使用孙文件夹)。
这三种情况如下:
可以加载该目录下的配置文件,也可以加载/a目录下的配置文件,但/a/b目录下的配置文件不会被加载,因为它们不是直接子文件夹。
配置文件可以放置在许多不同的位置。 如果多个配置文件中写入相同的属性,则后面加载的配置会覆盖前面的配置。 例如,将:.yaml中的项目端口号设置为8080,将项目当前目录//a/.yaml中的项目端口号设置为8081,则最终项目端口号为8081。
这是默认文件位置。
如果您不希望您的配置文件被调用。 或者 .yaml ,也可以自定义配置文件名,只需在项目启动时指定配置文件名即可,比如我想将我的配置文件名设置为 app.yaml ,那么我们在启动时可以进行如下配置jar包。 这时系统会自动去上面提到的五个位置寻找对应的配置文件:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.name=app
复制代码
如果项目已经打包成jar包并启动,则上述目录中,后三位中的项目当前目录指的是jar包所在目录。
如果不想在这五个位置搜索,也可以在启动jar包时显式指定配置文件的位置和名称,如下:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:classpath:/app.yaml
复制代码
注意我前面加了:,表示如果配置文件不存在,会以默认的方式启动,不会报错说找不到配置文件。 如果不加这个前缀,当系统找不到指定的配置文件时,就会抛出异常,从而导致应用程序无法启动。
如果配置文件和jar包在同一个目录结构中,如下图:
那么启动脚本如下:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:javaboy/app.yaml
复制代码
如果..的配置只指定目录,则必须以/结尾。 例如上面的启动脚本也可以这样启动:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:javaboy/ --spring.config.name=app
复制代码
配置文件的位置由..属性锁定,配置文件的文件名由..name属性锁定。
2. 增设职位
之前关于配置文件位置的设置是为了覆盖现有的配置。 如果不想覆盖Boot默认的配置文件搜索策略,又想添加自己的,可以指定配置文件的位置,如下:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.additional-location=optional:javaboy/app.yaml
复制代码
如果本次额外指定的配置文件与已有的配置文件冲突,则以已有的配置文件为准。
3. 位置通配符
有一种情况,假设我有redis和mysql配置,我想把它放在两个不同的文件夹中,以便于管理,像这样:
然后项目启动时,可以通过通配符*批量扫描对应的文件夹:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:config结尾,即目录的最后部分可以不确定。
4.导入外部配置
从Boot2.4开始,我们还可以使用..方法导入配置文件。 与-相比,这种导入更加灵活,可以导入任意名称的配置文件。
spring.config.import=optional:file:./dev.properties
复制代码
甚至,这个..还可以导入一个不带扩展名的配置文件。 例如,我有一个格式为的配置文件,但是这个配置文件没有扩展名。 现在我想将其导入为配置文件,格式如下:
spring.config.import=optional:file:/Users/sang/dev[.properties]
复制代码
好了,看完上面的内容,文章开头的问题的答案就不用多说了~