五. 倉庫
在Maven中,任何一個依賴乘综、插件或者項目構(gòu)建的輸出,都可以稱之為 構(gòu)件套硼。Maven在某個統(tǒng)一的位置存儲所有項目的共享的構(gòu)件卡辰,這個統(tǒng)一的位置,我們就稱之為倉庫。(倉庫就是存放依賴和插件的地方)
任何的構(gòu)件都有唯一的坐標(biāo)九妈,Maven根據(jù)這個坐標(biāo)定義了構(gòu)件在倉庫中的唯一存儲路徑反砌。
坐標(biāo)和路徑的關(guān)系:
如果有如下坐標(biāo)
<dependency>
<groupId>com.meituan.service.group</groupId>
<artifactId>Test-SDK</artifactId>
<version>1.0</version>
</dependency>
那么對應(yīng)依賴的jar 包的路徑就是:com.meituan.service.group/Test-SDK/1.0.7/Test-SDK-1.0.7.jar
倉庫分類:
倉庫分為兩大類:本地倉庫 和 遠(yuǎn)程倉庫
遠(yuǎn)程倉庫又分為:中央倉庫、私服 和 其他公共庫
1)本地倉庫
默認(rèn)本地倉庫的目錄:.m2/repository萌朱,在安裝maven后并不會立即創(chuàng)建宴树,它是在第一次執(zhí)行maven命令的時候才被創(chuàng)建。
若想改變本地倉庫地址晶疼,需要在~/.m2/settings.xml酒贬,設(shè)置localRepository元素的值為想要的倉庫地址,注意翠霍,此時配置的maven的本地倉庫是屬于用戶范圍的锭吨,若想更改全局的倉庫地址需要在M2_HOME/conf/settings.xml中更改配置,但是當(dāng)maven 升級時壶运,conf 下的settings 會被重置耐齐,所以一般不建議修改全局的設(shè)置。
<settings>
<localRepository>new_path</localRepository>
</settings>
一個構(gòu)件只有在本地倉庫中之后蒋情,才能由其他Maven項目使用埠况,那么構(gòu)件如何進(jìn)入到本地倉庫中呢?最常見的是依賴Maven從遠(yuǎn)程倉庫下載到本地倉庫中棵癣。還有一種常見的情況是辕翰,將本地項目的構(gòu)件安裝到Maven倉庫中”芬辏可以在某個項目下執(zhí)行mvn clean install命令喜命。
2)中央倉庫
中央倉庫是默認(rèn)的遠(yuǎn)程倉庫,maven在安裝的時候河劝,自帶的就是中央倉庫的配置壁榕,包含這段配置的文件是所有Maven項目都會繼承的超級POM。
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
(關(guān)于上例中各個元素的含義可以參考 pom 文件解析的 環(huán)境配置 部分)
中央倉庫包含了絕大多數(shù)流行的開源Java構(gòu)件赎瞎,以及源碼牌里、作者信息、SCM务甥、信息牡辽、許可證信息等。一般來說敞临,簡單的Java項目依賴的構(gòu)件都可以在這里下載到态辛。
3)私服
私服是一種特殊的遠(yuǎn)程倉庫,它是架設(shè)在局域網(wǎng)內(nèi)的倉庫服務(wù)挺尿,私服代理廣域網(wǎng)上的遠(yuǎn)程倉庫奏黑,供局域網(wǎng)內(nèi)的Maven用戶使用炊邦。當(dāng)Maven需要下載構(gòu)件的時候,它從私服請求攀涵,如果私服不存在該構(gòu)件铣耘,則從外部的遠(yuǎn)程倉庫下載,緩存在私服上之后以故,再為Maven的下載請求提供服務(wù)蜗细,此外,一些無法從外部倉庫下載的構(gòu)件也能從本地上傳到私服上供大家使用怒详。
私服的特性:
節(jié)省自己的外網(wǎng)帶寬:減少重復(fù)請求造成的外網(wǎng)帶寬消耗
加速Maven構(gòu)件:如果項目配置了很多外部遠(yuǎn)程倉庫的時候炉媒,構(gòu)建速度就會大大降低
部署第三方構(gòu)件:有些構(gòu)件無法從外部倉庫獲得的時候,我們可以把這些構(gòu)件部署到內(nèi)部倉庫(私服)中昆烁,供內(nèi)部maven項目使用
提高穩(wěn)定性吊骤,增強控制:Internet不穩(wěn)定的時候,maven構(gòu)建也會變的不穩(wěn)定静尼,一些私服軟件還提供了其他的功能
降低中央倉庫的負(fù)荷:maven中央倉庫被請求的數(shù)量是巨大的白粉,配置私服也可以大大降低中央倉庫的壓力
當(dāng)前主流的maven私服:Apache的Archiva、JFrog的Artifactory 以及 Sonatype的Nexus
maven 從倉庫解析依賴的機制:
當(dāng)本地倉庫沒有依賴構(gòu)件的時候鼠渺,Maven會自動從遠(yuǎn)程倉庫下載鸭巴;當(dāng)依賴版本為快照版本的時候,Maven會自動找到最新的快照拦盹。這背后的依賴解析機制可以概括如下:
當(dāng)依賴的范圍是system的時候鹃祖,Maven直接從本地文件系統(tǒng)解析構(gòu)件
根據(jù)依賴坐標(biāo)計算倉庫路徑后,嘗試直接從本地倉庫尋找構(gòu)件普舆,如果發(fā)現(xiàn)相應(yīng)構(gòu)件恬口,則解析成功
在本地倉庫不存在相應(yīng)構(gòu)件的情況下,如果依賴的版本是顯式的發(fā)布版本構(gòu)件沼侣,如1.2祖能、2.1-beta-1等,則遍歷所有的遠(yuǎn)程倉庫蛾洛,發(fā)現(xiàn)后芯杀,下載并解析使用
如果依賴的版本是RELEASE或LATEST,則基于更新策略讀取所有遠(yuǎn)程倉庫的元數(shù)據(jù)groupId/artifactId/maven-metadata.xml雅潭,將其與本地倉庫的對應(yīng)元數(shù)據(jù)合并后,得到最新快照版本的值却特,然后基于該值檢查本地倉庫扶供,或者從遠(yuǎn)程倉庫下載
如果依賴的版本是SNAPSHOT,則基于更新策略讀取所有遠(yuǎn)程倉庫的元數(shù)據(jù)groupId/artifactId/version/maven-metadata.xml裂明,將其與本地倉庫的對應(yīng)元數(shù)據(jù)合并后椿浓,得到最新快照版本的值,然后基于該值檢查本地倉庫,或者從遠(yuǎn)程倉庫下載
如果最后解析得到的構(gòu)件版本是時間戳格式的快照扳碍,如1.4.1-20091104.121450-121提岔,則復(fù)制其時間戳格式的文件至非時間戳格式,如SNAPSHOT笋敞,并使用該非時間戳格式的構(gòu)件
遠(yuǎn)程倉庫的認(rèn)證:
大部分公共的遠(yuǎn)程倉庫無須認(rèn)證就可以直接訪問碱蒙,但我們在平時的開發(fā)中往往會架設(shè)自己的Maven遠(yuǎn)程倉庫,出于安全方面的考慮夯巷,我們需要提供認(rèn)證信息才能訪問這樣的遠(yuǎn)程倉庫赛惩。配置認(rèn)證信息和配置遠(yuǎn)程倉庫不同,遠(yuǎn)程倉庫可以直接在pom.xml中配置趁餐,但是認(rèn)證信息必須配置在settings.xml文件中喷兼。這是因為pom往往是被提交到代碼倉庫中供所有成員訪問的,而settings.xml一般只存在于本機后雷。因此季惯,在settings.xml中配置認(rèn)證信息更為安全。
<settings>
<!--配置遠(yuǎn)程倉庫認(rèn)證信息-->
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
</settings>
這里的關(guān)鍵是id元素臀突,settings.xml中server元素的id必須與pom.xml中需要認(rèn)證的repository元素的id完全一致勉抓。正是這個id將認(rèn)證信息與倉庫配置聯(lián)系在了一起。
部署構(gòu)件到遠(yuǎn)程倉庫:
當(dāng)我們要把自己的項目部署到遠(yuǎn)程倉庫供其他人使用時惧辈,需要在pom 中進(jìn)行配置琳状,主要是對distributionManagement 元素的配置
<distributionManagement>
<repository>
<id>meituan-nexus-releases</id>
<name>Meituan Nexus Repository</name>
<url>http://maven.sankuai.com/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>meituan-nexus-snapshots</id>
<name>Meituan Nexus Repository</name>
<url>http://maven.sankuai.com/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
distributionManagement 包含repository 和snapshotRepository 子元素,前者表示發(fā)布版本(穩(wěn)定版本)構(gòu)件的倉庫盒齿,后者表示快照版本(開發(fā)測試版本)的倉庫念逞。這兩個元素都需要配置id、name和url边翁,id為遠(yuǎn)程倉庫的唯一標(biāo)識翎承,name是為了方便人閱讀,關(guān)鍵的url表示該倉庫的地址符匾。
往遠(yuǎn)程倉庫部署構(gòu)件的時候叨咖,往往需要認(rèn)證,配置認(rèn)證的方式同上啊胶。
配置正確后春锋,運行命令mvn clean deploy,Maven就會將項目構(gòu)建輸出的構(gòu)件部署到配置對應(yīng)的遠(yuǎn)程倉庫雌团。
配置倉庫鏡像:
如果倉庫X可以提供倉庫Y存儲的所有內(nèi)容阁猜,那么就可以認(rèn)為X是Y的一個鏡像。換句話說某饰,任何一個可以從倉庫Y獲得的構(gòu)件儒恋,都能夠從它的鏡像中獲取善绎。舉個例子,http://maven.oschina.net/content/groups/public/ 是中央倉庫http://repo1.maven.org/maven2/ 在中國的鏡像诫尽,由于地理位置的因素禀酱,該鏡像往往能夠提供比中央倉庫更快的服務(wù)。因此牧嫉,可以配置Maven使用該鏡像來替代中央倉庫剂跟。需要修改settings.xml 中的配置,如下
<mirrors>
<mirror>
<id>maven.oschina.net</id>
<name>maven mirror in China</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
該例中驹止,mirrorOf的值為central浩聋,表示該配置為中央倉庫的鏡像,任何對于中央倉庫的請求都會轉(zhuǎn)至該鏡像臊恋,用戶也可以使用同樣的方法配置其他倉庫的鏡像衣洁。id表示鏡像的唯一標(biāo)識符,name表示鏡像的名稱抖仅,url表示鏡像的地址坊夫。
關(guān)于鏡像的一個更為常見的用法是結(jié)合私服。由于私服可以代理任何外部的公共倉庫(包括中央倉庫)撤卢,因此环凿,對于組織內(nèi)部的Maven用戶來說,使用一個私服地址就等于使用了所有需要的外部倉庫放吩,這可以將配置集中到私服智听,從而簡化Maven本身的配置。在這種情況下渡紫,任何需要的構(gòu)件都可以從私服獲得到推,私服就是所有倉庫的鏡像。這時惕澎,可以配置這樣的一個鏡像:
<!--配置私服鏡像-->
<mirrors>
<mirror>
<id>nexus</id>
<name>internal nexus repository</name>
<url>http://183.238.2.182:8081/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
該例中<mirrorOf>的值為星號莉测,表示該配置是所有Maven倉庫的鏡像,任何對于遠(yuǎn)程倉庫的請求都會被轉(zhuǎn)至http://183.238.2.182:8081/nexus/content/groups/public/ 唧喉。如果該鏡像倉庫需要認(rèn)證捣卤,則配置一個id為nexus的認(rèn)證信息即可。
需要注意的是八孝,由于鏡像倉庫完全屏蔽了被鏡像倉庫董朝,當(dāng)鏡像倉庫不穩(wěn)定或者停止服務(wù)的時候,Maven仍將無法訪問被鏡像倉庫干跛,因而將無法下載構(gòu)件子姜。
六. Maven 生命周期與插件
生命周期
Maven 的生命周期就是為了對所有的構(gòu)建過程進(jìn)行抽象和統(tǒng)一。Maven 總結(jié)了一套高度完善的驯鳖、易拓展的生命周期闲询。包括清理、初始化浅辙、編譯扭弧、測試、打包记舆、集成測試鸽捻、驗證、部署和站點生成等幾乎所有構(gòu)建步驟泽腮。即幾乎所有項目的構(gòu)建御蒲,都能映射到這樣一個生命周期上。Maven 的生命周期是抽象的诊赊,本身不做任何實際的工作厚满,實際的任務(wù)都交給插件來完成。類似于模板方法模式碧磅。只定義次序碘箍,不提供具體實現(xiàn)。
Maven 提供了三套生命周期鲸郊,即:clean丰榴、default、site秆撮,三套生命周期互相獨立四濒,每套生命周期都包含一些階段,階段是有序的职辨,即要執(zhí)行后面的階段盗蟆,必須會先執(zhí)行前面的階段。
1)clean:在構(gòu)建之前執(zhí)行一些清理工作
包含階段:
階段 | 作用 |
---|---|
pre-clean | 執(zhí)行一些需要在clean之前完成的工作 |
clean | 移除所有上一次構(gòu)建生成的文件 |
post-clean | 執(zhí)行一些需要在clean之后立刻完成的工作 |
2)default:構(gòu)建項目的核心部分拨匆,包括編譯姆涩、測試、打包惭每、部署等
包含階段:
階段 | 作用 |
---|---|
validate | 驗證項目是否正確, 以及所有為了完整構(gòu)建必要 的信息是否可用 |
initialize | 初始化構(gòu)建狀態(tài)骨饿,比如生成properties,創(chuàng)建目錄等 |
generate-sources | 生成所有需要包含在編譯過程中的源代碼 |
process-sources | 處理源代碼,比如過濾一些值 |
generate-resources | 生成所有需要包含在打包過程中的資源文件 |
process-resources | 復(fù)制并處理資源文件至目標(biāo)目錄, 準(zhǔn)備打包台腥。一般來說宏赘,是對src/main/resources目錄的內(nèi)容進(jìn)行變量替換等工作后,復(fù)制到項目輸出的主classpath目錄中黎侈。 |
compile | 編譯項目的主源碼察署。一般來說,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄下 |
process-classes | 后處理編譯生成的文件,例如對Java類進(jìn)行字節(jié) 碼增強(bytecode enhancement) |
generate-test-sources | 生成所有包含在測試編譯過程中的測試源碼 |
process-test-sources | 處理測試源碼,比如過濾一些值 |
generate-test-resources | 生成測試需要的資源文件 |
process-test-resources | 復(fù)制并處理資源文件至測試的目標(biāo)目錄峻汉。一般來說贴汪,是對src/test/resources目錄的內(nèi)容進(jìn)行變量替換等工作后脐往,復(fù)制到項目輸出的測試classpath目錄中 |
test-compile | 編譯項目的測試代碼。一般來說扳埂,是對編譯src/test/java目錄下的Java文件至項目輸出的測試classpath目錄中 |
process-test-classes | 處理test-compile 之后生成的文件业簿,比如對Java 類的二進(jìn)制代碼進(jìn)行增強操作。這個階段是maven 2.0.5 之后才有 |
test | 使用單元測試框架運行測試阳懂,測試代碼不會被打包或部署 |
prepare-package | 在真正的打包之前,執(zhí)行一些準(zhǔn)備打包必要的操作梅尤。這通常會產(chǎn)生一個包的展開的處理過的版本 |
package | 接受編譯好的代碼,打包成可發(fā)布的格式岩调,如JAR |
pre-integration-test | 執(zhí)行一些在集成測試運行之前需要的動作巷燥。如建立集成測試需要的環(huán)境 |
integration-test | 如果有必要的話,處理包并發(fā)布至集成測試可以運行的環(huán)境 |
post-integration-test | 執(zhí)行一些在集成測試運行之后需要的動作。如清理集成測試環(huán)境 |
verify | 執(zhí)行所有檢查,驗證包是有效的,符合質(zhì)量規(guī)范 |
install | 將包安裝到Maven本地倉庫号枕,供本地其他Maven項目使用 |
deploy | 將最終的包復(fù)制到遠(yuǎn)程倉庫缰揪,供其他開發(fā)人員和Maven項目使用 |
3)site:生成項目報告,站點堕澄,發(fā)布站點
包含階段:
階段 | 作用 |
---|---|
pre-site | 執(zhí)行一些在生成項目站點之前需要完成的工作 |
site | 生成項目站點的文檔 |
post-site | 執(zhí)行一些在生成項目站點之后需要完成的工作 |
site-deploy | 將生成的項目站點發(fā)布在服務(wù)器上 |
參考文檔:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
插件
1)插件目標(biāo):
對于插件邀跃,為了能復(fù)用代碼,一個插件有多個功能蛙紫,每個功能稱為一個插件目標(biāo)拍屑,比如maven-dependency-plugin 插件,可以實現(xiàn)以下三種任務(wù)
- dependency:analyze:分析項目依賴坑傅,幫助找出潛在的無用依賴
- dependency:tree:列出項目的依賴樹僵驰,幫助分析依賴來源
- dependency:list:列出項目所有已解析的依賴
那么插件目標(biāo)是如何實現(xiàn)復(fù)用的呢,這就涉及到插件目標(biāo)和階段(phase)的綁定
2)插件綁定:
通過將插件的目標(biāo)(goal)與 build 生命周期 中 phase 綁定到一起唁毒,這樣蒜茴,當(dāng)要執(zhí)行某個 phase 時,就調(diào)用插件來完成綁定的目標(biāo)浆西。它們之間的一個關(guān)系如圖所示
從圖中可以看出粉私,每一個階段可以綁定0 個 或 多個目標(biāo),每個插件可以提供 1 個或多個目標(biāo)近零。
maven 中內(nèi)置了一些綁定:
當(dāng)項目的打包方式(<packing/>)為 ejb / ejb3 / jar / par / rar / war 時诺核,內(nèi)置綁定如下:
階段 | 目標(biāo) |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war |
install | install:install |
deploy | deploy:deploy |
當(dāng)打包方式為 maven-plugin 時,內(nèi)置綁定:
階段 | 目標(biāo) |
---|---|
generate-resources | plugin:descriptor |
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar and plugin:addPluginArtifactMetadata |
install | install:install |
deploy | deploy:deploy |
當(dāng)打包方式為 pom 是久信,內(nèi)置綁定:
階段 | 目標(biāo) |
---|---|
package | site:attach-descriptor |
install | install:install |
deploy | deploy:deploy |
當(dāng)然我們也可以自定義綁定窖杀,例如:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>name</id>
<phase>process-classes</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
execlusions下的每一個execlusion用來配置執(zhí)行一個任務(wù),<id> 是任務(wù)名稱裙士。綁定之后入客,利用maven 命令可以看到該插件被使用。
phase 指定 生命周期的階段,這里我們將AspectJ 插件的目標(biāo)綁定到了process-classes 階段桌硫,goal 用來指定 插件目標(biāo)夭咬。
3)插件配置:
可以對插件目標(biāo)進(jìn)行配置,以滿足項目需求铆隘,比如自定義插件目標(biāo)和生命周期階段的綁定皱埠,配置插件目標(biāo)的參數(shù)以調(diào)整其所執(zhí)行的任務(wù)等
命令行配置:
例如:mvn install -Dmaven.test.skip=true
參數(shù)-D是Java自帶的,其功能是通過命令行設(shè)置一個Java系統(tǒng)屬性咖驮,Maven簡單地重用了該參數(shù),在準(zhǔn)備插件的時候檢查系統(tǒng)屬性训枢,便實現(xiàn)了插件參數(shù)的配置
其他參數(shù):
-D 傳入屬性參數(shù)
-U 強制去遠(yuǎn)程參考更新snapshot包
-P 使用pom中指定的配置
-e 顯示maven運行出錯的信息
-o 離線執(zhí)行命令,即不去遠(yuǎn)程倉庫更新包
-X 顯示maven允許的debug信息
使用pom 文件配置:
<plugin>
<configuration>
<compilerId>groovy-eclipse-compiler</compilerId>
<source>${java-version}</source>
<target>${java-version}</target>
<encoding>${encoding}</encoding>
</configuration>
</plugin>
4)插件解析:
與依賴一樣托修,插件同樣存儲在maven倉庫,使用的時候maven從本地倉庫尋找插件恒界,找不到就去遠(yuǎn)程插件倉庫尋找睦刃,然后下載到本地倉庫使用。同樣可以在pom或者settings中添加遠(yuǎn)程插件倉庫配置十酣。
pom中是使用 pluginRepositories 元素聲明倉庫地址涩拙。
插件前綴與groupId:artifactId 是一一對應(yīng)的,匹配關(guān)系存在倉庫元數(shù)據(jù)中耸采,這里的元數(shù)據(jù)為groupId/maven-metadata.xml, groupId 由兩個中央倉庫確定兴泥。
七. POM 的聚合與繼承
軟件設(shè)計人員往往會采用各種方式對軟件劃分模塊,以得到更清晰的設(shè)計及更高的重用性虾宇。因此當(dāng)把Maven應(yīng)用到實際的項目中的時候搓彻,也需要將項目分成不同的模塊。Maven的聚合特性嘱朽,能夠?qū)㈨椖康母鱾€模塊聚合在一起構(gòu)建旭贬,而maven的繼承特性則能幫助抽取各模塊相同的依賴和插件等配置,在簡化 POM的同時搪泳,還能促進(jìn)各模塊配置的一致性稀轨。
聚合
如果想在一個項目中構(gòu)建出多個子module,而子module中又有很多公共依賴岸军,此時我們就需要將子module公共部分抽象出來奋刽,來生成一個父模塊,父模塊包含子模塊公共部分凛膏。
mvnProj 為聚合模塊杨名, 沒有src,只有個pom猖毫,因為聚合模塊只是聚合其他模塊的台谍,本身無實際內(nèi)容
對聚合模塊的pom來說,packaging的值必須是pom,通過module元素來聲明子模塊趁蕊,每個module的值都是當(dāng)前pom的相對目錄
<project>
<packaging>pom</packaging>
<modules>
<module>demo</module>
<module>library</module>
</project>
例子:運行mvn clean install
maven會解析聚合模塊的pom坞生,計算出一個構(gòu)建順序,然后依次構(gòu)建各個模塊掷伙。
繼承
繼承由聚合發(fā)展而來是己,如上圖所示,demo 模塊和 library 模塊繼承了mvnProj 模塊任柜,需要在pom 文件中指定parent
<project>
<parent>
<artifactId>mvnProj</artifactId>
<groupId>com.whx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
</project>
子模塊中沒有聲明自己的groupId和version卒废,默認(rèn)從父模塊中繼承這兩個元素,那么都有哪些元素可以被繼承呢
有:groupId宙地、version摔认、description、organization宅粥、contributors参袱、developers、issueManagement秽梅、properties抹蚀、dependecies、dependencyManagement企垦、repositories环壤、build、reporting
現(xiàn)在有一個問題钞诡,比如我在原有項目基礎(chǔ)上又新增一個模塊C镐捧,但是它依賴的部分和其他兩個模塊依賴的部分的關(guān)系不確定,這時面臨重寫父模塊依賴的情況臭增,但其實一個更好的做法是在父模塊中使用 dependencyManagement 元素來聲明依賴懂酱,子模塊根據(jù)自己所需再進(jìn)行聲明,詳見之前介紹pom 文件時的 dependencyManagement 用法誊抛。
反應(yīng)堆
反應(yīng)堆指的就是這個構(gòu)件結(jié)構(gòu)列牺,他是由Maven自動分析出來的,基本原則就是按照module的聲明順序進(jìn)行解析拗窃,如果某一module依賴另一module瞎领,則遍歷到他的根module,然后遞歸的進(jìn)行構(gòu)件随夸。
裁剪反應(yīng)堆:既然Maven有能力解析九默,那么也能相應(yīng)的通過命令指定構(gòu)件的模塊
比如如下反應(yīng)堆:parent, child1, child2
mvn clean install -pl child1 child2??#-pl 指定構(gòu)件的模塊, child1 child2被構(gòu)件
mvn clean install -pl child1 -am??#-am 表示同時構(gòu)件其父模塊,parent child1被構(gòu)件
mvn clean install -pl parent -amd??#-amd 表示同時構(gòu)件其子模塊宾毒,parent child1 child2被構(gòu)件
mvn clean install -rf child1??#-rf 指示從反應(yīng)堆的哪個模塊開始構(gòu)件驼修,child1 child2被構(gòu)件
八. 環(huán)境差異化構(gòu)建
Maven 屬性
在pom 文件中,maven 可以使用的屬性有以下幾種:
profile
之前我們在介紹pom.xml 文件時就曾介紹過profile 元素,這個元素就是用來設(shè)置或者覆蓋配置默認(rèn)值乙各,為不同的環(huán)境定制構(gòu)建墨礁,然后就可以在運行Maven的時候激活相應(yīng)的profile來使用相應(yīng)的配置。
最常見的我們在測試和發(fā)布時使用的數(shù)據(jù)庫耳峦、url恩静、密碼等就是不同的,我們都可以通過profile 來定義不同的配置蹲坷,例如
<profiles>
<profile>
<id>local</id>
<activation>
<!-- 指定默認(rèn)激活 -->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<url>localhost</url>
<name>local_name</url>
<pwd>1234567</pwd>
</properties>
<build>
<resources>
<!-- 通過resource指定不同profile加載配置文件的路徑, 可以指定多個resource路徑 -->
<resource>
<directory>src/main/profiles/local</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<id>release</id>
<properties>
<url>www.hhh.com</url>
<name>release_name</url>
<pwd>7654321</pwd>
</properties>
<build>
<resources>
<resource>
<directory>src/main/profiles/release</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<profiles>
上例中驶乾,我們定義的properties 使用時就像在project 節(jié)點下定義的properties的使用一樣,如 database.jdbc.url = ${url}
激活profile 的方式:
- 命令行激活循签,使用-P加profile的id轻掩,如 mvn compile -Prelease
- settings里顯式激活,activeProfiles元素懦底,如 <activeProfiles>local</activeProfiles>
- 系統(tǒng)屬性激活,pom里配置activation屬性罕扎,詳見前文pom 文件解析
- 默認(rèn)激活聚唐,定義profile的時候指定其默認(rèn)激活,即上例中的activeByDefault 元素=true
如果pom中有任何一個profile使用其他任一方式激活了腔召,那么所有默認(rèn)激活配置失效杆查。
查看當(dāng)前激活的profile:mvn help:active-profiles
查看當(dāng)前所有profile:mvn help:all-profiles
profile的種類:
- 在pom中聲明,只對當(dāng)前項目有效
- 用戶settings中聲明臀蛛,對當(dāng)前用戶的maven項目有效
- 全局settings中聲明亲桦,對所有maven項目有效
pom中聲明的profile,可使用的元素非常多
settings中聲明的profile浊仆,由于只是對于本機的配置客峭,存在移植性問題,所以可使用的元素非常少:repositories抡柿、pluginRepositories舔琅、properties