第一步:從簡(jiǎn)單的說(shuō)起
件開(kāi)發(fā)中經(jīng)常有開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、預(yù)發(fā)布環(huán)境、生產(chǎn)環(huán)境,而且一般這些環(huán)境配置會(huì)各不相同,比如數(shù)據(jù)庫(kù)、應(yīng)用端口號(hào)等配置就不一樣,每次打包發(fā)布手動(dòng)改配置麻煩且容易出錯(cuò),如果能在不修改配置的基礎(chǔ)上簡(jiǎn)單操作就能實(shí)現(xiàn)切換是不是很美,那么我就一個(gè)application.yml配置文件,這么多份環(huán)境配置難道都寫(xiě)在這里,那我們?cè)囋嚳?/p>

原來(lái)application.yml文件可以用 --- 來(lái)劃分區(qū)塊,一個(gè)區(qū)塊代表一個(gè)環(huán)境,這樣就把多環(huán)境配置內(nèi)容集中寫(xiě)入到一個(gè)主配置文件中了,主配置文件application.yml就是系統(tǒng)啟動(dòng)默認(rèn)會(huì)使用的配置文件,那我們啟動(dòng)一下看看效果(注意:第一區(qū)塊是主配置內(nèi)容必須要有的,啟用其它區(qū)塊會(huì)將相同配置內(nèi)容進(jìn)行覆蓋替換)

好的,當(dāng)前使用的默認(rèn)配置端口是8080,那么如何切換成8888呢,配置如下激活dev,再次運(yùn)行

查看運(yùn)行后端口為8888,這樣我們就完成了簡(jiǎn)單的多環(huán)境切換,你也可以切換成9999,只需要將dev改成prod

目前我們多環(huán)境只對(duì)端口進(jìn)行了區(qū)別,如果每個(gè)區(qū)塊配置不同的數(shù)據(jù)庫(kù)配置,比如第一區(qū)塊配置成本地?cái)?shù)據(jù)庫(kù)那么他就會(huì)連本地?cái)?shù)據(jù)庫(kù),那么prod當(dāng)然就是配置生產(chǎn)的數(shù)據(jù)庫(kù)了。如果本地、測(cè)試、生產(chǎn)所有配置都一樣唯獨(dú)數(shù)據(jù)庫(kù)不一樣,那么每個(gè)區(qū)塊會(huì)有很多重復(fù)的配置,而且application.yml文件被塞得滿滿當(dāng)當(dāng),查看蠻頭疼的,但是在這個(gè)前提上我如果本地開(kāi)發(fā)時(shí)想連接prod的數(shù)據(jù)庫(kù),那么直接active:prod啟用就可以了。
至此,看起來(lái)用idea開(kāi)發(fā)時(shí)切換是沒(méi)問(wèn)題的,那么打包時(shí)是什么情況呢,那就認(rèn)為idea運(yùn)行的是哪個(gè)環(huán)境,打包時(shí)默認(rèn)用的就是哪個(gè)環(huán)境,當(dāng)前idea項(xiàng)目啟動(dòng)運(yùn)行端口為8888,這里可以先停掉idea當(dāng)前這個(gè)服務(wù),因?yàn)榇虬髥?dòng)jar包會(huì)導(dǎo)致沖突,然后我們maven打包,先clean是將你當(dāng)前的jar包刪除清理,package為打包

找到j(luò)項(xiàng)目ar包



cmd回車(chē)進(jìn)入控制臺(tái),執(zhí)行命令 運(yùn)行jar包
java -jar 你的jar包

啟動(dòng)后查看端口為8888 ,說(shuō)明我們之前的猜想沒(méi)問(wèn)題,就是本地idea當(dāng)前運(yùn)行的是哪個(gè)環(huán)境,打包后就是哪個(gè)環(huán)境

我想在這個(gè)時(shí)候切換環(huán)境怎么辦,簡(jiǎn)單!我們ctrl+c退出停掉當(dāng)前啟動(dòng)的項(xiàng)目,重新啟動(dòng)執(zhí)行以下命令
java -jar 你的jar包 --spring.profiles.active=prod

啟動(dòng)端口為9999沒(méi)錯(cuò),當(dāng)然你部署到Linux也是一樣的
第二步:來(lái)點(diǎn)有難度的玩兒法
新建幾個(gè)環(huán)境配置文件,我想大家對(duì)這個(gè)都不陌生,項(xiàng)目會(huì)根據(jù)約定規(guī)則后綴dev、prod、test找到相應(yīng)文件

application-dev.yml端口改成8082,其它原有配置不變,然后啟動(dòng)


發(fā)現(xiàn)項(xiàng)目啟動(dòng)端口為8082

說(shuō)明用多個(gè)文件配置優(yōu)先級(jí)要高于集中在application.yml這種方式,而且這種方式優(yōu)于集中配置便于區(qū)分管理環(huán)境,其它都和上述測(cè)試情況一致這里就不做對(duì)比測(cè)試了(原則就是被激活application-dev.yml的環(huán)境配置與application.yml主配置中相同內(nèi)容會(huì)被前者覆蓋替換),一般這種方式用的比較多,application.yml中的區(qū)塊就可以刪除掉了。
另外idea中還可以這樣激活當(dāng)前選用環(huán)境

第三步:來(lái)點(diǎn)高年級(jí)的吧
大家可能經(jīng)常看到有些項(xiàng)目他是這樣指定當(dāng)前激活的環(huán)境,如下

這是使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包,首先需要對(duì)pom進(jìn)行以下配置
<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>
<!-- 是否默認(rèn) true表示默認(rèn)-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<package.environment>test</package.environment>
</properties>
</profile>
<profile>
<!-- 生產(chǎn)環(huán)境 -->
<id>prod</id>
<properties>
<package.environment>prod</package.environment>
</properties>
</profile>
</profiles>

好的同步pom之后,maven會(huì)出現(xiàn)一個(gè)profiles的選項(xiàng),因?yàn)闆](méi)有配置profiles之前是沒(méi)有的,而且發(fā)現(xiàn)它默認(rèn)勾選了dev但是灰色的,我們先啟動(dòng)看看能不能起到激活dev作用

啟動(dòng)成功,dev應(yīng)該是8082,說(shuō)明已激活,這里灰色選中可以理解為默認(rèn)激活

點(diǎn)擊勾選變成深色,啟動(dòng)依然8082(注意每次點(diǎn)擊切換都要reimport刷新下maven)


繼續(xù)點(diǎn)擊不勾選,啟動(dòng)報(bào)錯(cuò)


不勾選會(huì)導(dǎo)致@package.environment@引用失效,項(xiàng)目無(wú)法啟動(dòng)

同樣也會(huì)導(dǎo)致這里爆紅

此處就有坑了,按理說(shuō)我們只能選一個(gè)環(huán)境才對(duì)啊,結(jié)果這里可以雙擊選中多個(gè)

結(jié)果啟動(dòng)的是prod,但是ctrl點(diǎn)擊@package.environment@切換到了這個(gè)位置

也就是這塊有bug按理說(shuō)是互斥的,但是多點(diǎn)幾次是混亂的完全無(wú)規(guī)律可言,所以盡量選中其中一個(gè),不要多選,這樣就正常了

此時(shí)啟動(dòng)后也是test的端口,ctrl點(diǎn)擊@package.environment@切換到了test的位置,然后勾選prod同上步驟測(cè)試也沒(méi)問(wèn)題

再來(lái)看看maven打包

同樣找到j(luò)ar包c(diǎn)md運(yùn)行jar包啟動(dòng),發(fā)現(xiàn)激活了dev,沒(méi)問(wèn)題,那么java -jar 你的jar包 --spring.profiles.active=test這種方式就很有意思了,首先它會(huì)去找test這個(gè)配置文件,發(fā)現(xiàn)找不到,因?yàn)閴焊鶝](méi)打包進(jìn)來(lái),所以只有勾選了才會(huì)打包,是不是這樣我們?nèi)抗催x打包試試看。


打包后直接啟動(dòng),激活的是prod,然后我們指定激活test,發(fā)現(xiàn)沒(méi)什么卵用,啟動(dòng)端口成了8080就是按照沒(méi)有任何配置的情況來(lái)處理,也就是把prod的配置都搞得不能用了

所以,我們還是需要哪個(gè)指定哪個(gè)打包的比較好
也可以指定環(huán)境打包
mvn clean package -P dev
mvn clean package -P test
mvn clean package -P prod