简单介绍:
在之前我们写配置文件的时候,我们直接在项目中的resources下面编写的配置文件,其实除了在这个路径下编写配置文件,还可以在其他的地方编写配置文件,并且不同位置的配置文件在启动的时候的优先级也是不一样的。
1、在resources下编写配置文件:
这种方式是我们最常见的方式,但是在所有的配置文件的优先级中,这种方式是最低的,一般这种方式是在我们开发阶段中使用的配置文件编写方式。
我们在resources文件夹下的配置文件中编写一个配置,将服务器的启动端口设置为81端口,然后我们启动服务器:
这里服务器端口的默认值8080就被我们自己编写的配置中的81给替换了。
2、在resources的config目录下的配置文件
在读取配置文件的时候,其实还有一层隐形的目录,就是config目录,他会先在resources的config目录下寻找对应的配置文件,如果没有,再从resources文件夹下开始找,也就是说,如果我们再resources下面创建一个config文件夹,并在里面编写配置文件的话,他会覆盖掉我们直接在resources中编写的配置文件:
我们这次在resources下面的config文件夹中创建配置文件,然后编写一个配置将服务器的端口配置成82端口,这次我们重启服务器,按照我们的猜想,他启动的端口应该是82端口:
看到他确实是在82端口启动了端口,说明resources下的config文件夹中的配置文件的优先级大于直接在resources下写的配置文件。
3、和Jar包同级的配置文件
在介绍这个配置文件之前,我们先介绍一下打包方式,我们常规的打包方式有两种,一个是war包,一个是jar包,前者是用于web程序的压缩包,jar包是类归档文件,我们的SpringBoot如果要打包的话就需要打包成一个jar包,具体操作步骤如下:
我们使用IDEA工具帮我们完成打包的工作:
我们点击侧边栏中的Maven图标,一开始我们会看到有三个下拉菜单,第一个叫生命周期,第二个是插件,第三个是依赖项,那么IDEA提供了Maven中对应生命周期的按钮,我们直接点击就可以了,这里唯一需要注意的一点就是我们在打包的时候,要点击生命周期里面的package,千万不要点击插件里面的jar,虽然两者都能把项目打包成jar包,但是效果是完全不一样的。
如果你出现了一下的报错信息:
【没有主清单属性】,这就表示在你打包的过程中的步骤出错了,我们重新一次就可以了,记住是双击生命周期里面的package:
然后我们就可以在项目中的target中看到我们打包好的jar包:
为了方便操作,我们直接把这个jar包复制到D盘根目录下,然后我们直接启动这个jar包:
在黑窗口中使用命令行的方式启动:java -jar 打包好的jar包。这样就启动了我们的jar包,主要是为了脱离我们的IDEA工具,我们肯定不能每次都依靠IDEA启动,毕竟我们肯定不会在服务器上安装一个IDEA的。
然后就开始我们的主要内容,观察我们刚才启动的项目,我们的端口号是不是跟刚才一样还是在82端口启动的,现在我们在这个jar包同级目录下,创建一个配置文件,并且把端口号修改成83:
注意我们配置文件的位置,以及我们在配置文件中编写的内容,然后我们再次启动我们的jar包:
这次的端口就变成了我们在jar包同级文件夹下的配置文件中的配置值,那么也就是说,与jar包同级的配置文件优先级大于resources下的config文件夹中的配置文件。
4、与jar包同级的config中的配置文件
和之前一样,如果我们在jar包的同级目录下创建一个config文件夹,那么这个文件夹中的配置文件的优先级肯定是最高的:
总结:
在我们的配置文件的等级划分中,优先级由低到高分别是:resources中的配置文件<resources中的config中的配置文件<与jar包同级的配置文件<与jar包同级的config文件夹中的配置文件
那么为什么要分这么多的等级呢?
我们在做项目的时候,开发环境和实际的部署环境可能有很大的出入,或者是在部署环境中的一些敏感信息不希望开发人员知道,所以开发人员就在自己的模拟环境中使用一套配置文件进行开发。然后更高一级的,就留给运维的人做测试,再高的就交给其他的人这样就有了配置文件的等级划分,以及优先级高的配置文件会直接覆盖低级的配置文件,防止出错。
一般来讲,优先级低的两个位置用于在项目验收阶段做整体的调控,更高的两个位置用于项目在上线的时候做调控。
一些有关打包时候的理论知识:
在我们之前打包的时候,说过如果我们使用了错误的打包方式,会导致我们的在直接启动jar包的时候无法启动,要用正确的maven的方式去打包才行,那么这两种打包出来的jar包有何区别呢?
在我们使用Maven的生命周期的时候,他会调用我们的打包插件,这个插件是我们在创建SPringBoot项目的时候他自己帮我们导入的,就是这个东西:
那么他干了什么呢,首先,他为了能让你的项目单独的跑起来,他把你项目中用到的jar包全都给你连带着一起打包了,所以如果你去看一下刚才我们打出来的jar包的属性的话,你会发现他比较大,就是因为里面有很多的jar包。
除了jar包,里面还有一个工具类,这个工具类的作用是帮我们的程序单独运行用的,也就是说,这个jar包除了你自己写的代码占很少的一一部分,其他的很大的部分其实都是为了让你的程序可以单独运行而放置的依赖项。
那么之后这样,一个完整的可独立运行程序才算完整,就可以在任何的安装了java的平台上运行,比如Linxu环境的服务器上,或者是Win的服务器,这就是Java的跨平台特性了。
临时属性:
除了在配置文件中配置属性,我们也可以使用临时属性的方式,在启动项目的时候配置一些属性,让这些属性在单次启动的临时生效:
我们在启动的时候添加这样的参数,参数的写法是有要求的,参数前面要用-- 两个横线,多个参数之间用空格隔开,然后是k-v的写法,然后我们启动项目,这样项目就会在85端口启动:
临时属性的优先级很高,所以如果你想临时覆盖一些属性也可以使用这种方式。
除了在命令行中使用临时属性,在IDEA中也是可以使用临时属性的:
我们点击右上角的运行选项,然后点击编辑配置:
在这里可以添加运行的参数,如果你使用的IDEA版本太高没有这个框框,那么你需要点击一下右上方的蓝色字“修改选项” :
点击程序实参然后添加上去就可以了。
那么参数是如何传递的呢?我们打开引导类:
看到这个main方法的ages选项了吗,我们刚才配置的环境变量的信息都会封装到这里面,然后SpringBoot的方法用这个参数当做方法的参数,这样就将我们配置的临时属性传递进去了。你要是不信你可以输出一下试一试:
我们打印一下agrs变量里面的信息:
第一行就输出了我们之前配置的程序实参的内容,这是一个固定的写法,并不是SpringBoot的特特性,也就是说我们以后如果遇到了需要些配置项,或者写命令参数的地方,也可以使用这种方法进行传递。