Maven 知識(二)

五. 倉庫

在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)系如圖所示


image.png

從圖中可以看出粉私,每一個階段可以綁定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公共部分抽象出來奋刽,來生成一個父模塊,父模塊包含子模塊公共部分凛膏。


image.png

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 可以使用的屬性有以下幾種:

image.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洲劣,隨后出現(xiàn)的幾起案子备蚓,更是在濱河造成了極大的恐慌,老刑警劉巖囱稽,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊尝,死亡現(xiàn)場離奇詭異,居然都是意外死亡战惊,警方通過查閱死者的電腦和手機流昏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人横缔,你說我怎么就攤上這事铺遂。” “怎么了茎刚?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵襟锐,是天一觀的道長。 經(jīng)常有香客問我膛锭,道長粮坞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任初狰,我火速辦了婚禮莫杈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奢入。我一直安慰自己筝闹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布腥光。 她就那樣靜靜地躺著关顷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪武福。 梳的紋絲不亂的頭發(fā)上议双,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音捉片,去河邊找鬼平痰。 笑死,一個胖子當(dāng)著我的面吹牛伍纫,可吹牛的內(nèi)容都是我干的宗雇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莹规,長吁一口氣:“原來是場噩夢啊……” “哼逾礁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起访惜,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘹履,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后债热,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砾嫉,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年窒篱,在試婚紗的時候發(fā)現(xiàn)自己被綠了焕刮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶沿。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖配并,靈堂內(nèi)的尸體忽然破棺而出括荡,到底是詐尸還是另有隱情,我是刑警寧澤溉旋,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布畸冲,位于F島的核電站,受9級特大地震影響观腊,放射性物質(zhì)發(fā)生泄漏邑闲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一梧油、第九天 我趴在偏房一處隱蔽的房頂上張望苫耸。 院中可真熱鬧,春花似錦儡陨、人聲如沸褪子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫌褪。三九已至,卻和暖如春叙身,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硫狞。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工信轿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人残吩。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓财忽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泣侮。 傳聞我的和親對象是個殘疾皇子即彪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • |-1-更新內(nèi)容[6.從倉庫解析依賴的機制(重要)] 1Maven倉庫作用 倉庫用來存儲所有項目使用到構(gòu)件,在ma...
    zlcook閱讀 6,057評論 0 25
  • 在Maven中,任何一個依賴蛹锰、插件或者項目構(gòu)建的輸出深胳,都可以稱之為構(gòu)件。 Maven在某個統(tǒng)一的位置存儲所有項目的...
    三也視界閱讀 2,121評論 0 4
  • 在 Maven 的術(shù)語中铜犬,倉庫是一個位置(place)舞终。Maven 倉庫是項目中依賴的第三方庫轻庆,這個庫所在的位置叫...
    41uLove閱讀 6,975評論 2 3
  • Maven的基本了解 什么是Maven? Maven就是Apache下的一個開源項目敛劝。它是用純java開發(fā)的余爆。是一...
    Bcome閱讀 2,820評論 0 7
  • 晨跑完回家7:00了趕快動手做飯,兒子今天8:00到校就好夸盟。一會兒喊兒子吃飯了蛾方,兒子說沒胃口不想吃。心靈感應(yīng)啊满俗,我...