上篇文章我们一起新建了一个springboot项目,那么如果我们的8080端口被占用了呢,该如何修改内嵌servlet服务器tomcat的端口呢?其实很简单只要在配置文件中做一下简单配置就行了。
首先我们新建一个springboot的web项目,名称是demo1,当然也可以在我们上篇文章创建的springboot项目的基础上继续做,这个我们选择的工具是IDEA,接下来进入正题。
.properties格式文件语法比较简单,大项.小项 的形式。例如:我们要把tomcat的端口改成8081,在application.properties中可以这样配置,如下图:
接下来启动项目,查看控制台的日志如下图,说明此时服务的端口已经改变成8081了。
k: v
表示一对键值对(k冒号和v之间有一个空格) 以空格的缩进来控制层级关系;
只要是左对齐的一列数据都是同一层级的。
如下图,下面的配置中port和path是同一层级的,属性和值也是大小写敏感的;
a.字面量
普通的值(数字、字符串、布尔);
k: v:字面量直接来写;
字符串默认不用加上单引号和双引号;
“”:双引号;转义字符会起作用,例如:
name: “zhangsan \n lisi” 输出:zhangsan 换行 lisi
’:单引号;转义字符不会起作用,例如:
name: ‘zhangsan \n lisi’ 输出:zhangsan \n lisi
b.对象、Map(属性和值)(键值对)
k: v:在下一行来写对象的属性和值的关系,对象还是k: v的方式。例如:
还有一种行内写法,如下图:
c.数组(List、Set)
- value表示数组中的一个元素,如下图:
它也有行内写法,如下图:
在项目的application.yml文件中,做如下配置(前提先把刚才在application.properties文件中配置注释掉):
接下来启动项目,查看控制台的日志如下图,说明此时服务的端口已经改变成8082了。
补充:那么问题来了如果application.properties文件中配置的服务器端口为8081,application.yml文件配置的是8082,那么以哪个为准呢?答案是以application.properties文件的配置为准,该文件的优先级比较高。
我们在主配置文件编写的时候,文件名可以是:application-{profile}.properties/yml;
我们可以创建多个这样的配置文件,如下:
当前配置:application.properties,配置端口为8081
开发环境:application-dev.properties,配置端口号为8082:
生产环境:application-pord.properties,配置端口号为80
默认使用application.properties文件的配置,现在启动项目后,端口号为8081。
如果我们想要开发环境的配置application-dev.properties生效,在默认配置文件application.properties文件中做如下配置:
现在再重新启动该项目,可以看到端口号为8082了。
.yml配置文件中用三个段横线把整个配置分成一个一个的文档。
我们在application.yml文件中如下配置。这时候我们的光标放在下图位置,下面显示document 2/3,可见的确是第二个文档。
这时候我们启动项目,查看端口号,可见此时默认生效的是第一个document的配置,
那如果,我们要其他文档配置的端口号生效呢
例如:我们要开发环境dev配置的端口号生效,添加下图红框中的配置
现在来启动项目,查看端口号为8083,可见dev的端口配置生效了。
在配置文件中指定要激活的配置文件(有多个配置文件,格式如:application-{profile}.properties),如下图(每个配置文件配置的端口号如红色箭头所指):
例如激活开发环境配置文件application-dev.properties
例如要生产环境端口号配置生效,用 –spring.profiles.active=prod。
步骤:
a.点击Edit Configuration
b.在弹出页面进行如下配置,让application-prod.properties配置文件生效,点击OK
c.重新启动项目,可以看到端口号是8084,说明生产环境prod的配置生效了。
a.把我们的项目先打包,如下图:
b.右键target目录,点击show in Explorer
c.点进target文件夹,找到我们刚才打的包
d.在路径栏输入cmd,回车,进入dos窗口。
输入:java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod ,再回车启动jar包。(--spring.profiles.active前面是两个短杠)
e.可以看到,端口号为8084,说明我们这种命令行启动方式使生产环境配置生效了。
例如要开发环境端口号配置生效,用 –Dspring.profiles.active=dev
步骤:
a.点击Edit Configuration
b.在弹出页面进行如下配置,再点击OK(这里配置的是 VM options的参数和方式二命令行配置的Program arguments不同).
c.重新启动项目,可以看到端口号是8084,说明生产环境prod的配置生效了。
一次激活多个配置文件,没有冲突的配置都生效,有冲突的配置,后面的配置生效。
我有两个yml文件,分别为:application-test.yml、application-cdd.yml,让这两个配置文件都生效,这样执行:
java -jar xxx.jar --spring.profiles.active="test,cdd"
使用示例:
java -jar xxx.jar
# 指定外部配置文件
--spring.config.location=C:\Users\CHENGdd\Desktop\test\application-test.yml
# 指定激活test环境配置文件
--spring.pfofiles.active=test
# 指定自定义的配置项
--time-task.distributed.deploymentCount=2
--time-task.distributed.currentNo=1
# 指定端口
--server.port=9090
## 指定多个配置文件(外部文件跟jar包放同样的目录,内部的话放resource下)
--spring.profiles.active="test,cdd"
springboot启动会扫描以下位置的application.prpperties或者application.yml文件作文springboot的默认配置文件。注:file是项目根目录,classpath(类路径)resources目录下
——file:/config/
——file:./
——classpath:/config/
——classpath:/
以上是按照优先级从高到低的顺序,所以位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
我们也可以通过配置spring.config.location来改变默认配置。
springboot会从这四个位置全部加载主配置文件:互补配置
互补配置:如果高优先级配置文件和低优先级配置文件都配置了某个属性,那么以高优先级的为准,如果低优先级配置文件配置了某个属性,而高优先级的没有配置,则低优先级配置文件的这个属性会生效。
注意:项目打包时,file:/config/ 和file:./下的配置文件不会被打进去。
我们还可以通过spring.config.location来改变默认的配置文件位置。
场景:项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。
指定配置文件和默认加载的这些配置文件都会生效形成互补配置。
a.首先我们在E:\springboot1目录下复制一份application.properties文件,并把其里面的端口号改为8085,如下图:
b.点进target文件夹,找到我们刚才打的包
c.在路径栏输入cmd,回车,进入dos窗口。
输入命令: java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.location=E:/springboot1/application.properties
d.查看日志,端口号为8085,说明指定到E盘的这个配置文件生效了
springboot可以从很多位置加载配置,官方文档中介绍了17个,springBoot外部配置官方文档 实际上我们常用的有下面这11个,优先级从高到低,高优先级会覆盖低优先级的配置,所有的配置会形成互补配置,如下:
(1).命令行参数
例:java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=9001
多个配置用--隔开,配置项=值
例:jar -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=9002 --server.context-path=/abc
(2).来自java:comp/env的NDI属性
(3).Java系统属性(System.getProperties())
(4).操作系统环境变量
(5).RandomValuePropertySource配置的random.*属性
//优先加载带 profile 的,再来加载不带 profile 的,从jar包外向jar内寻找
(6).jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
(7).jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
(8).jar包外部的application.properties或application.yml(不带spring.profile)配置文件
(9).jar包内部的application.properties或application.yml(不带spring.profile)配置文件
(10).@Configuration注解类上的@PropertySource
(11).通过SpringApplication.setDefaultProperties指定的默认配置属性
所有支持的配置加载来源,可以参考我们的官方文档
到这里springboot项目配置文件部分就说到这里了,最近老熬夜,得赶紧睡觉了,有什么问题欢迎指出,欢迎随时交流沟通!