第一步:从简单的说起
件开发中经常有开发环境、测试环境、预发布环境、生产环境,而且一般这些环境配置会各不相同,比如数据库、应用端口号等配置就不一样,每次打包发布手动改配置麻烦且容易出错,如果能在不修改配置的基础上简单操作就能实现切换是不是很美,那么我就一个application.yml配置文件,这么多份环境配置难道都写在这里,那我们试试看

原来application.yml文件可以用 --- 来划分区块,一个区块代表一个环境,这样就把多环境配置内容集中写入到一个主配置文件中了,主配置文件application.yml就是系统启动默认会使用的配置文件,那我们启动一下看看效果(注意:第一区块是主配置内容必须要有的,启用其它区块会将相同配置内容进行覆盖替换)

好的,当前使用的默认配置端口是8080,那么如何切换成8888呢,配置如下激活dev,再次运行

查看运行后端口为8888,这样我们就完成了简单的多环境切换,你也可以切换成9999,只需要将dev改成prod

目前我们多环境只对端口进行了区别,如果每个区块配置不同的数据库配置,比如第一区块配置成本地数据库那么他就会连本地数据库,那么prod当然就是配置生产的数据库了。如果本地、测试、生产所有配置都一样唯独数据库不一样,那么每个区块会有很多重复的配置,而且application.yml文件被塞得满满当当,查看蛮头疼的,但是在这个前提上我如果本地开发时想连接prod的数据库,那么直接active:prod启用就可以了。
至此,看起来用idea开发时切换是没问题的,那么打包时是什么情况呢,那就认为idea运行的是哪个环境,打包时默认用的就是哪个环境,当前idea项目启动运行端口为8888,这里可以先停掉idea当前这个服务,因为打包后启动jar包会导致冲突,然后我们maven打包,先clean是将你当前的jar包删除清理,package为打包

找到j项目ar包



cmd回车进入控制台,执行命令 运行jar包
java -jar 你的jar包

启动后查看端口为8888 ,说明我们之前的猜想没问题,就是本地idea当前运行的是哪个环境,打包后就是哪个环境

我想在这个时候切换环境怎么办,简单!我们ctrl+c退出停掉当前启动的项目,重新启动执行以下命令
java -jar 你的jar包 --spring.profiles.active=prod

启动端口为9999没错,当然你部署到Linux也是一样的
第二步:来点有难度的玩儿法
新建几个环境配置文件,我想大家对这个都不陌生,项目会根据约定规则后缀dev、prod、test找到相应文件

application-dev.yml端口改成8082,其它原有配置不变,然后启动


发现项目启动端口为8082

说明用多个文件配置优先级要高于集中在application.yml这种方式,而且这种方式优于集中配置便于区分管理环境,其它都和上述测试情况一致这里就不做对比测试了(原则就是被激活application-dev.yml的环境配置与application.yml主配置中相同内容会被前者覆盖替换),一般这种方式用的比较多,application.yml中的区块就可以删除掉了。
另外idea中还可以这样激活当前选用环境

第三步:来点高年级的吧
大家可能经常看到有些项目他是这样指定当前激活的环境,如下

这是使用maven实现多环境运行和打包,首先需要对pom进行以下配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${package.environment}.yml</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<package.environment>dev</package.environment>
</properties>
<!-- 是否默认 true表示默认-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<package.environment>test</package.environment>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<package.environment>prod</package.environment>
</properties>
</profile>
</profiles>

好的同步pom之后,maven会出现一个profiles的选项,因为没有配置profiles之前是没有的,而且发现它默认勾选了dev但是灰色的,我们先启动看看能不能起到激活dev作用

启动成功,dev应该是8082,说明已激活,这里灰色选中可以理解为默认激活

点击勾选变成深色,启动依然8082(注意每次点击切换都要reimport刷新下maven)


继续点击不勾选,启动报错


不勾选会导致@package.environment@引用失效,项目无法启动

同样也会导致这里爆红

此处就有坑了,按理说我们只能选一个环境才对啊,结果这里可以双击选中多个

结果启动的是prod,但是ctrl点击@package.environment@切换到了这个位置

也就是这块有bug按理说是互斥的,但是多点几次是混乱的完全无规律可言,所以尽量选中其中一个,不要多选,这样就正常了

此时启动后也是test的端口,ctrl点击@package.environment@切换到了test的位置,然后勾选prod同上步骤测试也没问题

再来看看maven打包

同样找到jar包cmd运行jar包启动,发现激活了dev,没问题,那么java -jar 你的jar包 --spring.profiles.active=test这种方式就很有意思了,首先它会去找test这个配置文件,发现找不到,因为压根没打包进来,所以只有勾选了才会打包,是不是这样我们全部勾选打包试试看。


打包后直接启动,激活的是prod,然后我们指定激活test,发现没什么卵用,启动端口成了8080就是按照没有任何配置的情况来处理,也就是把prod的配置都搞得不能用了

所以,我们还是需要哪个指定哪个打包的比较好
也可以指定环境打包
mvn clean package -P dev
mvn clean package -P test
mvn clean package -P prod