使用maven的profile構(gòu)建不同環(huán)境配置的方法
最近使用到了maven的profile功能,發(fā)現(xiàn)這個(gè)功能的確很好用也很實(shí)用,這塊的知識(shí)比較多也比較亂,其實(shí)真正理解了之后非常簡單,為了鞏固總結(jié)知識(shí),有個(gè)更清晰的知識(shí)體系,本文誕生了,希望能讓像我一樣零基礎(chǔ)的小白一看就懂,有請戲精,閃亮登場~~
1.背景
作為一名猿,在實(shí)際的項(xiàng)目開發(fā)中,通常會(huì)有很多配置環(huán)境,比如最基本的:開發(fā)、測試、生產(chǎn);不同的環(huán)境,某些文件的配置是不一樣的(如:數(shù)據(jù)庫連接信息、properties文件的配置等),如果我們進(jìn)行開發(fā)or測試時(shí)每次都得手動(dòng)去修改配置文件,難免有些麻煩且容易出現(xiàn)問題(我反正是深有體會(huì)╥﹏╥),所以,當(dāng)當(dāng)當(dāng)當(dāng)~maven的profile功能就出現(xiàn)了。
2.Profile簡介
簡單說一下,maven的profile可以讓我們定義一系列的配置信息,然后指定其激活條件。這樣我們就可以定義多個(gè)profile,然后每個(gè)profile對應(yīng)不同的激活條件和配置信息,從而達(dá)到不同環(huán)境使用不同配置信息的目的。
3.Profile在哪定義
一般來講,有三種地方可以定義,不同的地方,作用范圍不同,可配置項(xiàng)也不同;
- 針對于特定項(xiàng)目的profile配置,我們可以定義在該項(xiàng)目的pom.xml中。
- 針對于特定用戶的profile配置,我們可以在用戶的settings.xml文件中定義profile。該文件在用戶目錄下的“.m2”目錄下。
- 全局的profile配置。全局的profile是定義在Maven安裝目錄下的“conf/settings.xml”文件中的。
4.Profile使用實(shí)例
ps:前方將使用Eclipse來演示,主要以pom配置為主,重點(diǎn)涉及到了profile、filter、resource標(biāo)簽,工程源代碼在文章最末尾。
過多的理論就不再說了,還是配合著實(shí)例代碼來看更容易理解一些。另外,構(gòu)建不同的環(huán)境配置主要有兩種效果(或者叫實(shí)現(xiàn)方式):
- 第一種,根據(jù)不同的環(huán)境生成不同的配置文件(profile+resources);
- 第二種,根據(jù)不同的環(huán)境生成不同的配置內(nèi)容,并替換原配置文件中的內(nèi)容(profile+resources+filters);
什么意思?可能比較抽象,別捉急,我們一個(gè)一個(gè)演示。哦對了,先放一張項(xiàng)目結(jié)構(gòu)圖嘗嘗鮮(為了結(jié)構(gòu)更清晰,我把單元測試的包刪了):

4.1 生成不同配置文件
本實(shí)例達(dá)到的效果是:根據(jù)不同的環(huán)境,動(dòng)態(tài)打包生成不同環(huán)境下的 db.properties 文件。
(1)在pom.xml中的project節(jié)點(diǎn)下配置profile
<profiles>
<!-- 開發(fā) -->
<profile>
<!-- profile的id -->
<id>dev</id>
<properties>
<!-- 此處的jastar.env可以自定義,其他地方可以使用${jastar.env}來引用此屬性 -->
<jastar.env>dev</jastar.env>
</properties>
<activation>
<!-- 默認(rèn)激活此配置 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 測試 -->
<profile>
<id>test</id>
<properties>
<jastar.env>test</jastar.env>
</properties>
</profile>
<!-- 生產(chǎn) -->
<profile>
<id>prd</id>
<properties>
<jastar.env>prd</jastar.env>
</properties>
</profile>
</profiles>(2)建立三種環(huán)境的資源文件夾,如下:
src/main/filters/dev src/main/filters/test src/main/filters/prd
并添加各自的db.properties文件:

注意:maven標(biāo)準(zhǔn)目錄中,提供了一個(gè)filters目錄用于存放資源過濾文件。推薦在filters目錄下創(chuàng)建,而不是resources目錄,因?yàn)閞esources目錄中的文件默認(rèn)情況下是不會(huì)被過濾的,還需在resources節(jié)點(diǎn)下額外的配置一些東西;這樣的話結(jié)構(gòu)也較清晰,resource目錄存放公共資源文件,filters目錄存放不同環(huán)境差異化資源文件。
(3)配置maven-resources-plugin插件
在構(gòu)建WAR包的時(shí)候會(huì)經(jīng)過資源文件處理階段,maven-resources-plugin 則用來處理資源文件。在pom.xml中的build節(jié)點(diǎn)下配置如下:
<plugins> <!-- 編譯插件,此處用來設(shè)置jdk的版本,否則默認(rèn)的版本很低 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 資源文件處理插件,必須配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins>
(4)配置resources節(jié)點(diǎn)
在pom.xml中的build節(jié)點(diǎn)下配置如下:
<!-- 最后生成的資源文件 -->
<resources>
<!-- 所有公共資源文件 -->
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- 不同環(huán)境的資源文件 -->
<resource>
<directory>src/main/filters/${jastar.env}</directory>
</resource>
</resources>(5)打包測試
至此,配置已經(jīng)完成了,細(xì)心的童鞋會(huì)發(fā)現(xiàn),我們maven update 項(xiàng)目之后,資源目錄會(huì)出現(xiàn)以下現(xiàn)象:
沒錯(cuò),這說明我們的配置生效了,因?yàn)槟J(rèn)的profile是dev,所以Eclipse會(huì)智能的把該目錄顯示在這里。
好,接下來打包測試一下是否達(dá)到了我們的預(yù)期效果。右鍵項(xiàng)目Run AS,如下:
填寫maven命令后run:
運(yùn)行完成刷新項(xiàng)目可以看到,target目錄下生成了“demo-maven-profile.war”文件,打開文件可以看到生成的屬性文件如下:

查看db.properties文件內(nèi)容,perfect~當(dāng)然,你們也可以試試指定其他profile,在此不再演示。

4.2 注入不同的配置內(nèi)容
本實(shí)例達(dá)到的效果是:根據(jù)不同的環(huán)境,將
src/main/resources/log4j.properties中的部分內(nèi)容替換為src/main/filters/dev、test、prd/log4j.properties中的內(nèi)容。
(1)依然是先配置profile,上面已經(jīng)配置過了,同上。
(2)新建src/main/resources/log4j.properties文件如下:
(3)新建src/main/filters/dev、test、prd/log4j.properties文件如下:
(4)重點(diǎn)來了,在pom.xml的build節(jié)點(diǎn)下配置filters節(jié)點(diǎn)和resources節(jié)點(diǎn),如下(注意注釋部分):
<!-- 此處定義變量配置文件地址 -->
<filters>
<!-- 注意如果配置了多個(gè)filter,并且他們包含有相同的key,則以后面的value為最終值 -->
<filter>src/main/filters/${jastar.env}/log4j.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 這句配置是關(guān)鍵,表示該資源文件夾下要進(jìn)行過濾操作 -->
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/filters/${jastar.env}</directory>
</resource>
</resources>(5)打包測試
配置完成,接下來同樣以上面的方式打包,這里我的profile填寫test,運(yùn)行完成,打開war包,查看log4j.properties文件如下,可以看到log4j的部分內(nèi)容被替換了,實(shí)驗(yàn)成功!

5.擴(kuò)展
5.1 Profile的激活方式
1. 使用 activeByDefault 設(shè)置激活
在以上的實(shí)例中,我們使用了以下方式設(shè)置了默認(rèn)激活:
<activation> <activeByDefault>true</activeByDefault> </activation>
2. 在 settings.xml 中使用 activeProfiles 指定激活
profile配置如下:
<profiles> <profile> <id>profile1</id> <properties> <hello>lilei</hello> </properties> </profile> <profile> <id>profile2</id> <properties> <hello>hanmeimei</hello> </properties> </profile> </profiles>
激活如下(支持多個(gè)):
<activeProfiles> <activeProfile>profile1</activeProfile> </activeProfiles>
3. 在maven命令中使用參數(shù)顯示激活
Eclipse窗口式運(yùn)行幫我們隱藏了很多東西,其實(shí)原始的 maven 命令應(yīng)該是這樣寫的:
mvn clean package –Pprofile1
當(dāng)然,也可以取消激活:
mvn clean package –P!profile1
還有激活多個(gè):
mvn clean package -Pprofile1,profile2,!profile3
4. 根據(jù)環(huán)境來激活
profile一個(gè)非常重要的特性就是它可以根據(jù)不同的環(huán)境來激活,比如根據(jù)jdk的版本:
<!-- 如果jdk的版本為1.8則激活該profile --> <profiles> <profile> <id>profile1</id> <activation> <jdk>1.8</jdk> </activation> </profile> </profiles>
根據(jù)操作系統(tǒng):
<profiles>
<profile>
<id>profile1</id>
<activation>
<os>
<!-- 不必指定所有信息 -->
<name>linux</name>
<family>unix</family>
<arch>amd64</arch>
<version>3.19.0-30-generic</version>
</os>
</activation>
</profile>
</profiles>根據(jù)環(huán)境變量:
<profiles>
<profile>
<id>profile1</id>
<activation>
<property>
<name>debug</name>
<value>true</value>
</property>
</activation>
</profile>
</profiles>根據(jù)文件是否存在來激活:
<profiles>
<profile>
<id>profile1</id>
<activation>
<file>
<missing>/path/to/missing/file</missing>
<exists>/path/to/exists/file</exists>
</file>
</activation>
</profile>
</profiles>不同類型的激活方式可以組合使用,但是只有但兩個(gè)條件都匹配時(shí)才能激活。
5.2 關(guān)于Filter
Filter 是 maven 的 resource插件提供的功能,作用是用環(huán)境變量、pom文件里定義的屬性和指定配置文件里的屬性替換屬性(*.properties)文件里的占位符(${jdbc.url})。
在src/main/resources目錄有個(gè)配置文件jdbc.properties,內(nèi)容如下:
jdbc.url=${pom.jdbc.url}
jdbc.username=${pom.jdbc.username}
jdbc.passworkd=${pom.jdbc.password}配置 resource 插件,啟用filtering功能并添加屬性到pom:
<project>
...
<!-- 用pom里定義的屬性做替換 -->
<properties>
<pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url>
<pom.jdbc.username>root</pom.jdbc.username>
<pom.jdbc.password>123456</pom.jdbc.password>
</properties>
<build>
...
<!-- 可以把屬性寫到文件里,用屬性文件里定義的屬性做替換 -->
<filters>
<filter>src/main/filters.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
...
</project>編譯包后 target 目錄下的 jdbc.properties :
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev jdbc.username=root jdbc.passworkd=123456
文章到這里就差不多了,最后,為各位小伙伴默默奉上源代碼:傳送門
到此這篇關(guān)于使用maven的profile構(gòu)建不同環(huán)境配置的方法的文章就介紹到這了,更多相關(guān)maven profile構(gòu)建不同環(huán)境配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用Flyway實(shí)現(xiàn)數(shù)據(jù)庫版本控制的技術(shù)指南
在現(xiàn)代應(yīng)用開發(fā)中,數(shù)據(jù)庫結(jié)構(gòu)經(jīng)常隨著業(yè)務(wù)需求不斷演變,使用手動(dòng)SQL腳本管理數(shù)據(jù)庫版本,不僅容易出現(xiàn)錯(cuò)誤,還難以跟蹤和回滾,Flyway是一個(gè)強(qiáng)大的數(shù)據(jù)庫遷移工具,能夠幫助開發(fā)者高效管理和自動(dòng)化數(shù)據(jù)庫的版本控制,本文將介紹Flyway的基本功能及其在SpringBoot項(xiàng)目中的實(shí)踐2025-02-02
SpringBoot如何通過webjars管理靜態(tài)資源文件夾
這篇文章主要介紹了SpringBoot如何通過webjars管理靜態(tài)資源文件夾,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
MybatisX-Generator不生成domain文件夾的問題及解決
在使用MybatisX-Generator生成數(shù)據(jù)庫表實(shí)體時(shí),如果發(fā)現(xiàn)沒有生成domain文件夾以及User.java文件,是因?yàn)镸ybatisX版本更新,最新版需要在options里額外勾選model才能生成domain,勾選model并點(diǎn)擊finish后,成功生成domain文件夾及User.java文件2025-01-01
SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題
項(xiàng)目中經(jīng)常會(huì)出現(xiàn)重復(fù)提交的問題,本文主要介紹了SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
解決FeignClient發(fā)送post請求異常的問題
這篇文章主要介紹了FeignClient發(fā)送post請求異常的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot實(shí)現(xiàn)異步事件Event詳解
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)異步事件Event詳解,異步事件的模式,通常將一些非主要的業(yè)務(wù)放在監(jiān)聽器中執(zhí)行,因?yàn)楸O(jiān)聽器中存在失敗的風(fēng)險(xiǎn),所以使用的時(shí)候需要注意,需要的朋友可以參考下2023-11-11

