做此笔记是因为做了那么多项目,也打了很多包,居然还没弄的很明白。
还是那句话,蓦然回首,发现自己除了sb什么也不是。。。
所以不能再混沌下去了,必须弄明白。
如:
application-local.yml
application-test.yml
application-prd.yml
application.yml # 只配置profiles
打哪个环境的包,这里替换下就行:
spring:
profiles:
active: test
一种方式就是纯纯的不指定打包方式,到了各个环境启动脚本里面加。
固定:
vm里面加 -Dspring.profiles.active=local
一直没弄清楚什么时候只需要替换profiles即可。
什么时候需要复制文件。一般是两种都试试。
感觉和服务器的启动脚本有关,如果是自定义的脚本,就可以profiles。
如果是固定某个模块,就需要复制。
后来摸索了下,如果是java -jar命令方式启动,只修改application.yml的profiles即可。
如果是发版平台启动,需要复制下,因为发版平台默认都用ddd,所以只能复制到固定的文件目录。
这种方式比较优雅。
不用改任何配置,打包时,勾选idea maven界面的模块即可。
需要配置两部分:
1、pom.xml添加maven打包插件。
<plugins>
<plugin>
<artifactId>maven-deploy-pluginartifactId>
<configuration>
<skip>trueskip>
configuration>
plugin>
plugins>
2、pom.xml里面需要添加profiles。
<profiles>
<profile>
<id>devid>
<properties>
<profiles.active>src/main/resources/devprofiles.active>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
<id>testid>
<properties>
<profiles.active>src/main/resources/testprofiles.active>
properties>
profile>
<profile>
<id>prodid>
<properties>
<profiles.active>src/main/resources/prodprofiles.active>
properties>
profile>
profiles>
3、定义资源目录等(这一步必不可少)。
都是网上通用的配置。
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
<include>**/*.ymlinclude>
includes>
resource>
<resource>
<directory>${profiles.active}directory>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
<include>**/*.ymlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
<plugins>
<plugin>
<artifactId>maven-deploy-pluginartifactId>
<configuration>
<skip>trueskip>
configuration>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<finalName>${project.parent.name}finalName>
<outputDirectory>../targetoutputDirectory>
<fork>truefork>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
<exclude>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
exclude>
excludes>
configuration>
plugin>
plugins>
build>
这样就完成了。
本地启动的时候,直接勾选idea maven界面的profiles即可,勾选哪个就启动哪个。
打包的时候一样,勾选哪个就是哪个。
期待效果:
打包后会在classes目录下生成一个同于profile目录下配置的文件,如:application-custom.yml,并且内容和勾选的profile内容一致。 如果是这样,表示打包成功了。
这个不分环境了。profiles和复制都不用。
springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/ --> 当前项目根目录下的 config 目录下
–file:./ --> 当前项目的根目录下
–classpath:/config/ --> resources/config目录下
–classpath:/ --> resources目录下
SpringBoot官网:
优先级由高到底,高优先级的配置会覆盖低优先级的配置。
如果低优先级存在高优先级没有的属性,则会互补配置。
如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的
这四个位置是默认位置,即 Spring Boot 启动,默认会从这四个位置按顺序去查找相关属性并加载。
我们也可以通过 spring.config.location 属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找 application.properties 文件。
项目默认加载的配置文件名是 application ,我们可以通过属性 spring.config.name 来指定配置文件的文件名。
使用 spring.config.location 属性重新定义配置文件的位置,它会覆盖掉默认的四个位置。使用 spring.config.additional-location 这个属性自定义配置文件位置,表示在默认的四个位置的基础上,再添加几个位置,新添加的位置的优先级大于原本的位置。 在自定义配置文件位置时,值一定要以 / 结尾。例如 spring.config.location=classpath:/myconfig/
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
(1)命令行参数 (加载时优先加载) 所有的配置都可以在命令行上进行指定( --配置)。 可以通过指定 --spring.config.location来改变默认的配置文件位置:
多个配置用空格分开;格式为: --配置项=值
(2)来自java:comp/env的JNDI属性
(3)Java系统属性(在命令行中使用-D指定),可通过System.getProperties()获得相关内容
(4)操作系统环境变量
大多数操作系统不允许使用句点分隔的键名,使用下划线代替(例如,SPRING_CONFIG_NAME代替spring.config.name)
(5)RandomValuePropertySource配置的random.*属性值
(6)jar包外部的application-{profile}.properties或application-{profile}.yml(带spring.profile)配置文件。
(7)jar包内部的application-{profile}.properties或application-{profile}.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指定的默认属性
其中常用的为:(1)(6)(7)(8)(9)(10)
总结
优先加载操作系统层面的配置、命令行
由jar包外向jar包内进行寻找,优先查找config目录。
优先加载带profile(application-{profile}.yml)的,后加载不带profile(application.yml)的
高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
以Nacos为例:默认远程配置优先级最高
可以通过在远程配置中心中做如下配置,设置本地配置覆盖远程配置:
spring:
cloud:
config:
#是否允许本地配置覆盖远程配置
allow-override: true
#是否一切以本地配置为准,默认false
override-none: false
#系统环境变量或系统属性才能覆盖远程配置文件的配置
#本地配置文件中配置优先级低于远程配置,默认true
override-system-properties: true