在工作中序矩,我們經(jīng)常遇到多環(huán)境需要不同的配置文件沃暗,例如不同環(huán)境下連接的數(shù)據(jù)庫(kù)不一致冤馏。
在spring boot
項(xiàng)目中可以較為方便的集成典徊,那么在傳統(tǒng)的spring web
項(xiàng)目中應(yīng)該如何解決這個(gè)問(wèn)題呢内列,下面我們嘗試使用maven的filter進(jìn)行處理不同環(huán)境的變量值撵术。
配置pom文件
- 為pom文件添加profile的配置
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>local</env>
</properties>
</profile>
<profile>
<id>development</id>
<properties>
<env>development</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<env>production</env>
</properties>
</profile>
</profiles>
在本段代碼中,我們將local設(shè)置為默認(rèn)的環(huán)境變量话瞧,那么在我們打包的過(guò)程中如果不置頂環(huán)境變量嫩与,maven將按照默認(rèn)的local形式進(jìn)行打包。我們?yōu)槊總€(gè)profile設(shè)置了一個(gè)env
的變量值交排,該值可以讓我們?cè)谄渌糠峙渲弥苯右谩?/p>
- 配置filter
<filters>
<filter>src/main/resource/${env}/application.properties</filter>
</filters>
通過(guò)filter划滋,我們可以將不同環(huán)境目錄下的application.properties文件中的參數(shù)值加載到maven中,如果我們有多個(gè)properties可以在添加一個(gè)filter即可个粱。
- 配置resources
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>local/*</exclude>
<exclude>development/*</exclude>
<exclude>test/*</exclude>
<exclude>production/*</exclude>
</excludes>
</resource>
</resources>
通過(guò)指定filtering
表示該目錄下的文件都將通過(guò)maven的過(guò)濾進(jìn)行變量值的替換古毛,并且我們將源代碼中的多環(huán)境目錄進(jìn)行排除,在maven編譯生成的目錄將不會(huì)帶目錄文件都许。
配置application.properties文件
在src/main/resources/目錄下新建一個(gè)application.properties稻薇,并添加內(nèi)容
test.properties=@test.properties@
此處的@test.properties@為通過(guò)fileter篩選各自環(huán)境下的加入到maven的變量值。
例如src/main/resources/production/applicaiton.properties
文件內(nèi)容為:
test.properties=production
maven在編譯的過(guò)程中會(huì)替換 @test.properties@為production胶征,最終生成的application.properties文件內(nèi)容應(yīng)該為:
test.properties=production
通過(guò)上面的講解和代碼配置塞椎,我們完成了maven多環(huán)境變量的配置工作,接下來(lái)我們來(lái)使用maven編譯試試睛低?
- 通過(guò)命令進(jìn)行打包
mvn clean compile -Pproduction
- 查看目錄文件生成情況
常見(jiàn)問(wèn)題
maven在替換變量的時(shí)候案狠,默認(rèn)${]和@@表達(dá)式均可替換,如果我們?cè)趕pring 的xml配置文件中使用${} 也會(huì)被maven替換掉钱雷,為了避免該問(wèn)題骂铁,我們可以參考spring boot
的parent中的xml進(jìn)行配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
重點(diǎn)是delimiter的配置,該配置主要配置變量的分隔符罩抗,我們配置為@拉庵,那么它就不會(huì)對(duì)${}產(chǎn)生作用了,具體說(shuō)明可以參考maven的官方文檔 maven delimiters
結(jié)束
通過(guò)上面的展示套蒂,想必我們都已經(jīng)學(xué)會(huì)使用maven的多環(huán)境配置了钞支,本段的demo我也傳到github上,大家可以自行查看具體源代碼操刀。github源代碼