第一步:從簡(jiǎn)單的說起
件開發(fā)中經(jīng)常有開發(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)境配置難道都寫在這里粟按,那我們?cè)囋嚳?/p>
原來application.yml文件可以用 --- 來劃分區(qū)塊诬滩,一個(gè)區(qū)塊代表一個(gè)環(huán)境霹粥,這樣就把多環(huán)境配置內(nèi)容集中寫入到一個(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è)前提上我如果本地開發(fā)時(shí)想連接prod的數(shù)據(jù)庫(kù),那么直接active:prod啟用就可以了猜煮。
至此次员,看起來用idea開發(fā)時(shí)切換是沒問題的,那么打包時(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回車進(jìn)入控制臺(tái),執(zhí)行命令 運(yùn)行jar包
java -jar 你的jar包
啟動(dòng)后查看端口為8888 柿究,說明我們之前的猜想沒問題邮旷,就是本地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沒錯(cuò),當(dāng)然你部署到Linux也是一樣的
第二步:來點(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
說明用多個(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)境
第三步:來點(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)闆]有配置profiles之前是沒有的听皿,而且發(fā)現(xiàn)它默認(rèn)勾選了dev但是灰色的熟呛,我們先啟動(dòng)看看能不能起到激活dev作用
啟動(dòng)成功,dev應(yīng)該是8082尉姨,說明已激活庵朝,這里灰色選中可以理解為默認(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)目無法啟動(dòng)
同樣也會(huì)導(dǎo)致這里爆紅
此處就有坑了,按理說我們只能選一個(gè)環(huán)境才對(duì)啊覆致,結(jié)果這里可以雙擊選中多個(gè)
結(jié)果啟動(dòng)的是prod侄旬,但是ctrl點(diǎn)擊@package.environment@切換到了這個(gè)位置
也就是這塊有bug按理說是互斥的,但是多點(diǎn)幾次是混亂的完全無規(guī)律可言煌妈,所以盡量選中其中一個(gè)儡羔,不要多選,這樣就正常了
此時(shí)啟動(dòng)后也是test的端口璧诵,ctrl點(diǎn)擊@package.environment@切換到了test的位置汰蜘,然后勾選prod同上步驟測(cè)試也沒問題
再來看看maven打包
同樣找到j(luò)ar包c(diǎn)md運(yùn)行jar包啟動(dòng),發(fā)現(xiàn)激活了dev之宿,沒問題族操,那么java -jar 你的jar包 --spring.profiles.active=test這種方式就很有意思了,首先它會(huì)去找test這個(gè)配置文件比被,發(fā)現(xiàn)找不到色难,因?yàn)閴焊鶝]打包進(jìn)來泼舱,所以只有勾選了才會(huì)打包,是不是這樣我們?nèi)抗催x打包試試看枷莉。
打包后直接啟動(dòng)娇昙,激活的是prod,然后我們指定激活test依沮,發(fā)現(xiàn)沒什么卵用涯贞,啟動(dòng)端口成了8080就是按照沒有任何配置的情況來處理枪狂,也就是把prod的配置都搞得不能用了
所以危喉,我們還是需要哪個(gè)指定哪個(gè)打包的比較好
也可以指定環(huán)境打包
mvn clean package -P dev
mvn clean package -P test
mvn clean package -P prod