4 ?????? profile 介紹
4.1 ???? profile 簡介
profile 可以讓我們定義一系列的配置信息,然后指定其激活條件。這樣我們就可以定義多個(gè) profile ,然后每個(gè) profile 對(duì)應(yīng)不同的激活條件和配置信息,從而達(dá)到不同環(huán)境使用不同配置信息的效果。比如說,我們可以通過 profile 定義在 jdk1.5 以上使用一套配置信息,在 jdk1.5 以下使用另外一套配置信息;或者有時(shí)候我們可以通過操作系統(tǒng)的不同來使用不同的配置信息,比如 windows 下是一套信息, linux 下又是另外一套信息,等等。具體的激活條件有哪些我在后文會(huì)講到。
4.2 ???? profile 的定義位置
對(duì)于使用 Maven3 ,我們可以有多個(gè)地方定義 profile 。定義的地方不同,它的作用范圍也不同。
(1) ??? 針對(duì)于特定項(xiàng)目的 profile 配置我們可以定義在該項(xiàng)目的 pom.xml 中。
(2) ??? 針對(duì)于特定用戶的 profile 配置,我們可以在用戶的 settings.xml 文件中定義 profile 。該文件在用戶家目錄下的“ .m2 ”目錄下。
(3) ??? 全局的 profile 配置。全局的 profile 是定義在 Maven 安裝目錄下的“ conf/settings.xml ”文件中的。
4.3 ???? profile 中能定義的信息
profile 中能夠定義的配置信息跟 profile 所處的位置是相關(guān)的。以下就分兩種情況來討論,一種是定義在 settings.xml 中,另一種是定義在 pom.xml 中。
4.3.1? profile定義在settings.xml中
當(dāng) profile 定義在 settings.xml 中時(shí)意味著該 profile 是全局的,它會(huì)對(duì)所有項(xiàng)目或者某一用戶的所有項(xiàng)目都產(chǎn)生作用。因?yàn)樗侨值模栽? settings.xml 中只能定義一些相對(duì)而言范圍寬泛一點(diǎn)的配置信息,比如遠(yuǎn)程倉庫等。而一些比較細(xì)致一點(diǎn)的需要根據(jù)項(xiàng)目的不同來定義的就需要定義在項(xiàng)目的 pom.xml 中。具體而言,能夠定義在 settings.xml 中的信息有 <repositories> 、 <pluginRepositories> 和 <properties> 。定義在 <properties> 里面的鍵值對(duì)可以在 pom.xml 中使用。
4.3.2? profile定義在pom.xml中
定義在 pom.xml 中的 profile 可以定義更多的信息。主要有以下這些:
l ? <repositories>
l ? <pluginRepositories>
l ? <dependencies>
l ? <plugins>
l ? <properties>
l ? <dependencyManagement>
l ? <distributionManagement>
l ? 還有 build 元素下面的子元素,主要包括:
<defaultGoal>
<resources>
<testResources>
<finalName>
4.4 ???? profile 的激活方式
Maven 給我們提供了多種不同的 profile 激活方式。比如我們可以使用 -P 參數(shù)顯示的激活一個(gè) profile ,也可以根據(jù)環(huán)境條件的設(shè)置讓它自動(dòng)激活等。下面將對(duì)它們一一進(jìn)行介紹:
4.4.1? 使用activeByDefault設(shè)置激活
先看下面一個(gè)配置
<profiles> <profile> <id>profileTest1</id> <properties> <hello>world</hello> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>profileTest2</id> <properties> <hello>andy</hello> </properties> </profile> </profiles>
?
? ?????? 我們可以在 profile 中的 activation 元素中指定激活條件,當(dāng)沒有指定條件,然后指定 activeByDefault 為 true 的時(shí)候就表示當(dāng)沒有指定其他 profile 為激活狀態(tài)時(shí),該 profile 就默認(rèn)會(huì)被激活。所以當(dāng)我們調(diào)用 mvn package 的時(shí)候上面的 profileTest1 將會(huì)被激活,但是當(dāng)我們使用 mvn package –P profileTest2 的時(shí)候?qū)⒓せ? profileTest2 ,而這個(gè)時(shí)候 profileTest1 將不會(huì)被激活。
4.4.2? 在settings.xml中使用activeProfiles指定處于激活狀態(tài)的profile
我們可以在 settings.xml 中使用 activeProfiles 來指定需要激活的 profile ,這種方式激活的 profile 將所有情況下都處于激活狀態(tài)。比如現(xiàn)在我們定義了如下兩個(gè) profile
<profiles> <profile> <id>profileTest1</id> <properties> <hello>world</hello> </properties> </profile> <profile> <id>profileTest2</id> <properties> <hello>andy</hello> </properties> </profile> </profiles>
?
?????? 這里的 profile 可以是定義在 settings.xml 中的,也可以是定義在 pom.xml 中的。這個(gè)時(shí)候如果我們需要指定 profileTest1 為激活狀態(tài),那么我們就可以在 settings.xml 中定義 activeProfiles ,具體定義如下:
<activeProfiles> <activeProfile>profileTest1</activeProfile> </activeProfiles>
?
?????? 考慮這樣一種情況,我們?cè)? activeProfiles 下同時(shí)定義了多個(gè)需要激活的 profile 。這里還拿上面的 profile 定義來舉例,我們定義了同時(shí)激活 profileTest1 和 profileTest2 。
<activeProfiles> <activeProfile>profileTest1</activeProfile> <activeProfile>profileTest2</activeProfile> </activeProfiles>
?
?????? 從 profileTest1 和 profileTest2 我們可以看出它們共同定義了屬性 hello 。那么這個(gè)時(shí)候我在 pom.xml 中使用屬性 hello 的時(shí)候,它到底取的哪個(gè)值呢?是根據(jù) activeProfile 定義的順序,后面的覆蓋前面的嗎?根據(jù)我的測試,答案是非也,它是根據(jù) profile 定義的先后順序來進(jìn)行覆蓋取值的,然后后面定義的會(huì)覆蓋前面定義的。
4.4.3? 使用-P參數(shù)顯示的激活一個(gè)profile
假設(shè)我們現(xiàn)在有如下定義的 profiles
<profiles> <profile> <id>profileTest1</id> <properties> <hello>world</hello> </properties> </profile> <profile> <id>profileTest2</id> <properties> <hello>andy</hello> </properties> </profile> <profiles>
?
?????? 那么當(dāng)我們?cè)谶M(jìn)行 Maven 操作時(shí)就可以使用 -P 參數(shù)顯示的指定當(dāng)前激活的是哪一個(gè) profile 了。比如我們需要在對(duì)項(xiàng)目進(jìn)行打包的時(shí)候使用 id 為 profileTest1 的 profile ,我們就可以這樣做:
mvn package –P profileTest1
?
?????? 當(dāng)我們使用 activeByDefault 或 settings.xml 中定義了處于激活的 profile ,但是當(dāng)我們?cè)谶M(jìn)行某些操作的時(shí)候又不想它處于激活狀態(tài),這個(gè)時(shí)候我們可以這樣做:
Mvn package –P !profileTest1
?
?????? 這里假設(shè) profileTest1 是在 settings.xml 中使用 activeProfile 標(biāo)記的處于激活狀態(tài)的 profile ,那么當(dāng)我們使用“ -P !profile ”的時(shí)候就表示在當(dāng)前操作中該 profile 將不處于激活狀態(tài)。
4.4.4 根據(jù)環(huán)境來激活profile
profile 一個(gè)非常重要的特性就是它可以根據(jù)不同的環(huán)境來激活,比如說根據(jù)操作系統(tǒng)的不同激活不同的 profile ,也可以根據(jù) jdk 版本的不同激活不同的 profile ,等等。
4.4.4.1 根據(jù) jdk 來激活 profile
<profiles> <profile> <id>profileTest1</id> <jdk>1.5</jdk> </profile> <profiles>
?
?????? 上面情況表示在 jdk 為 1.5 版本系列的時(shí)候激活 profileTest1 。
<profiles> <profile> <id>profileTest1</id> <jdk>[1.4,1.7)</jdk> </profile> <profiles>
?
?????? 上面的情況表示在 jdk 為 1.4 、 1.5 和 1.6 的時(shí)候激活 profileTest1 。
4.4.4.2 根據(jù)操作系統(tǒng)來激活 profile
<profiles> <profile> <id>profileTest1</id> <activation> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> </activation> </profile> </profiles>
?
?????? 上面的情況就是根據(jù)操作系統(tǒng)的類型來激活 profileTest1 。
4.4.4.3 根據(jù)系統(tǒng)屬性來激活 profile
<profiles> <profile> <id>profileTest1</id> <activation> <property> <name>hello</name> <value>world</value> </property> </activation> </profile> </profiles>
?
上面的 profileTest1 將在提供了系統(tǒng)屬性 hello ,并且其值為 world 的時(shí)候激活。下面的做法可以激活 profileTest1 。
mvn package –Dhello=world
?
?????? 當(dāng)是下面的這種定義形式時(shí), profileTest1 將在指定了系統(tǒng)屬性 hello ,且其值為任意值的時(shí)候被激活。
<profiles> <profile> <id>profileTest1</id> <activation> <property> <name>hello</name> </property> </activation> </profile> </profiles>
?
4.4.4.4 根據(jù)文件是否存在激活 profile
<profiles> <profile> <id>profileTest1</id> <activation> <file> <exists>target</exists> </file> </activation> </profile> </profiles>
?
上面的定義表示當(dāng)存在 target 文件時(shí)激活 profileTest1 。
<profiles> <profile> <id>profileTest1</id> <activation> <file> <missing>target</missing> </file> </activation> </profile> </profiles>
?
?????? 上面的定義表示當(dāng)不存在 target 文件時(shí)激活 profileTest1 。
4.5 ???? 查看當(dāng)前處于激活狀態(tài)的 profile
我們可以同時(shí)定義多個(gè) profile ,那么在建立項(xiàng)目的過程中,到底激活的是哪一個(gè) profile 呢? Maven 為我們提供了一個(gè)指令可以查看當(dāng)前處于激活狀態(tài)的 profile 都有哪些,這個(gè)指定就是 mvn help:active-profiles 。
現(xiàn)在假設(shè)我們的 settings.xml 文件中有如下 profile 的定義:
<profiles> <profile> <id>profileTest1</id> <activation> <file> <missing>target</missing> </file> </activation> </profile> </profiles> <activeProfiles> <activeProfile>profileTest1</activeProfile> </activeProfiles>
?
?????? 這個(gè)時(shí)候我們可以看到,我們已經(jīng)定義了 profileTest1 始終為激活狀態(tài),這個(gè)時(shí)候我們使用 mvn help:active-profiles 查看處于激活狀態(tài)的 profile 時(shí),就會(huì)打印出如下內(nèi)容:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
