Maven實(shí)戰(zhàn)之聚合與繼承

何為Maven的聚合

假設(shè)有這么一個(gè)場(chǎng)景,有ABC三個(gè)項(xiàng)目,需要一次構(gòu)建三個(gè)項(xiàng)目躬厌,而不是分別到每個(gè)項(xiàng)目下面執(zhí)行mvn命令铛碑,這個(gè)時(shí)候Maven的聚合特性就是為了該需求而服務(wù)的狠裹。為了解決這個(gè)問(wèn)題,現(xiàn)需要?jiǎng)?chuàng)建一個(gè)父項(xiàng)目汽烦,注意:作為一個(gè)聚合項(xiàng)目涛菠,打包方式packaging為pom,下面就是聚合項(xiàng)目的例子

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

? <modelVersion>4.0.0</modelVersion>

? <groupId>com.fbb</groupId>

? <artifactId>fbbParent</artifactId>

? <version>1.0</version>

? <packaging>pom</packaging>

? <modules>

? ? <module>fbb-A</module>

? ? <module>fbb-B</module>

? ? <module>fbb-C</module>

? </modules>

? <dependencies>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>log4j</groupId>

? ? ? ? ? ? <artifactId>log4j</artifactId>

? ? ? ? ? ? <version>1.2.17</version>

? ? ? ? </dependency>

? </dependencies>

</project>

當(dāng)在父項(xiàng)目下面執(zhí)行mvn命令 mvn clean install 的時(shí)候撇吞,Maven會(huì)先解析結(jié)合項(xiàng)目的pom俗冻,分析要構(gòu)建的項(xiàng)目,并且計(jì)算出一個(gè)反應(yīng)堆構(gòu)建順序牍颈,然后根據(jù)這個(gè)順序進(jìn)行構(gòu)建迄薄。

何為Maven繼承

以上面的例子來(lái)說(shuō),可以做到了啟動(dòng)聚合項(xiàng)目煮岁,其下的項(xiàng)目都能一起執(zhí)行讥蔽,但是單單是構(gòu)建,確實(shí)沒(méi)什么問(wèn)題画机,但是三個(gè)項(xiàng)目冶伞,中存在相同的依賴(lài),也很正常步氏,通常來(lái)說(shuō)碰缔,一段代碼重復(fù)出現(xiàn)兩次以上,就得考慮著需要優(yōu)化了戳护,Maven中的繼承能夠解決這個(gè)需求,通過(guò)創(chuàng)建一個(gè)父項(xiàng)目瀑焦,配置一些公共的配置腌且,讓子類(lèi)繼承,做到一處聲明榛瓮,多個(gè)地方使用的效果铺董,同樣的作為父項(xiàng)目,它的打包方式跟聚合項(xiàng)目一樣禀晓,packaging也為pom

子類(lèi)A的配置

<?xml version="1.0"?>

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

? <modelVersion>4.0.0</modelVersion>

? <parent>

? ? <groupId>com.fbb</groupId>

? ? <artifactId>fbbParent</artifactId>

? ? <version>1.0</version>

? </parent>

? <artifactId>fbb-admin</artifactId>

? <packaging>war</packaging>

? <name>fbb-admin Maven Webapp</name>

? <url>http://maven.apache.org</url>

</project>

子項(xiàng)目B與子項(xiàng)目C大同小異精续,就不做舉例子了,上面可以看出聲明了一個(gè)Parent的標(biāo)簽粹懒,通過(guò)groupId重付,artifactId,version凫乖,定位到父項(xiàng)目确垫,可以看出子項(xiàng)目定義的時(shí)候弓颈,groupId,artifactId都沒(méi)有定義删掀,這不意味著沒(méi)有翔冀,是因?yàn)槔^承了父項(xiàng)目的groupId,artifactId披泪,所以不需要聲明纤子,當(dāng)然如果子項(xiàng)目的groupId,artifactId款票,需要不一樣控硼,可以顯示的聲明在pom上。

可以被繼承的Pom元素

groupId:項(xiàng)目組ID徽职,項(xiàng)目坐標(biāo)的核心元素

version:項(xiàng)目版本象颖,項(xiàng)目坐標(biāo)的核心因素

description:項(xiàng)目的描述信息

organization:項(xiàng)目的組織信息

inceptionYear:項(xiàng)目的創(chuàng)始年份

url:項(xiàng)目的URL地址

developers:項(xiàng)目的開(kāi)發(fā)者信息

contributors:項(xiàng)目的貢獻(xiàn)者信息

distributionManagement:項(xiàng)目的部署配置

issueManagement:項(xiàng)目的缺陷跟蹤系統(tǒng)信息

ciManagement:項(xiàng)目的持續(xù)集成系統(tǒng)信息

scm:項(xiàng)目的版本控制系統(tǒng)

malilingLists:項(xiàng)目的郵件列表信息

properties:自定義的Maven屬性

dependencies:項(xiàng)目的依賴(lài)配置

dependencyManagement:項(xiàng)目的依賴(lài)管理配置

repositories:項(xiàng)目的倉(cāng)庫(kù)配置

build:包括項(xiàng)目的源碼目錄配置、輸出目錄配置姆钉、插件配置说订、插件管理配置等

reporting:包括項(xiàng)目的報(bào)告輸出目錄配置、報(bào)告插件配置等

繼承的一些靈活措施

如上面的例子潮瓶,當(dāng)三個(gè)子項(xiàng)目繼承父項(xiàng)目的時(shí)候陶冷,相應(yīng)的依賴(lài),都會(huì)繼承毯辅,但是埂伦,實(shí)際情況上,不可能每個(gè)項(xiàng)目都是完完全玩一樣的一套依賴(lài)思恐,比如說(shuō)我有一個(gè)子項(xiàng)目沾谜,僅僅是用來(lái)提供一些工具,這個(gè)時(shí)候spring胀莹,mybatis相關(guān)的依賴(lài)基跑,它們就不應(yīng)該出現(xiàn)在子項(xiàng)目里面,如果出現(xiàn)描焰,這就顯得不合理了媳否。Maven提供的dependencyManagement元素既能夠讓子模塊繼承父模塊的依賴(lài)配置,又能保證子模塊依賴(lài)使用的靈活性荆秦,它的聲明不會(huì)引入實(shí)際的依賴(lài)篱竭。

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

? <modelVersion>4.0.0</modelVersion>

? <groupId>com.fbb</groupId>

? <artifactId>fbbParent</artifactId>

? <version>1.0</version>

? <packaging>pom</packaging>

? <modules>

? ? <module>fbb-A</module>

? ? <module>fbb-B</module>

? ? <module>fbb-C</module>

? </modules>

? <properties>

? ? ? <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

? ? ? <junit.version>4.9</junit.version>

</properties>

<dependencyManagement>

? ? <dependencies>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>junit</groupId>

? ? ? ? ? ? <artifactId>junit</artifactId>

? ? ? ? ? ? <version>${junit.version}</version>

? ? ? ? ? ? <scope>test</scope>

? ? ? ? </dependency>? ?

? ? </dependencies>

</dependencyManagement>

</project>

子類(lèi)A的配置

<?xml version="1.0"?>

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

? <modelVersion>4.0.0</modelVersion>

? <parent>

? ? <groupId>com.fbb</groupId>

? ? <artifactId>fbbParent</artifactId>

? ? <version>1.0</version>

? </parent>

? <artifactId>fbb-admin</artifactId>

? <packaging>war</packaging>

? <name>fbb-admin Maven Webapp</name>

? <url>http://maven.apache.org</url>

<dependencies>

? ? <dependency>

? ? ? ? <groupId>junit</groupId>

? ? ? ? <artifactId>junit</artifactId>

? ? </dependency>? ?

</dependencies>

</project>

可以發(fā)現(xiàn)在子類(lèi)聲明依賴(lài)的時(shí)候,版本跟scope都沒(méi)有聲明了步绸,因?yàn)闀?huì)使用在父類(lèi)中配置掺逼,但是其實(shí)可以發(fā)現(xiàn),配置相比不繼承的瓤介,沒(méi)有節(jié)省多少內(nèi)容坪圾,但是這種方式可以讓各個(gè)項(xiàng)目的版本統(tǒng)一晓折,項(xiàng)目的依賴(lài)更加的靈活。

插件的依賴(lài)管理

插件跟項(xiàng)目依賴(lài)一樣兽泄,有類(lèi)似于dependencyManagement的元素pluginManagement元素能進(jìn)行類(lèi)似的需求漓概,在該元素下配置的依賴(lài),不會(huì)造成實(shí)際的插件調(diào)用行為病梢,當(dāng)pom配置了plugin元素胃珍,而且groupId,artifactId匹配的時(shí)候蜓陌,pluginManagement就會(huì)起到真正的作用觅彰。

聚合繼承的反應(yīng)堆順序

構(gòu)建順序的形成過(guò)程:Maven按序讀取Pom,如果該P(yáng)om沒(méi)有依賴(lài)模塊钮热,那么就構(gòu)建該模塊填抬,如果有就先構(gòu)建其依賴(lài)模塊,如果其依賴(lài)模塊還有其他的依賴(lài)模塊隧期,就先構(gòu)建它的依賴(lài)模塊飒责,總之就是先一步的構(gòu)件其依賴(lài)的模塊,模塊間的依賴(lài)關(guān)系使得反應(yīng)堆順序形成一個(gè)有向非循環(huán)圖仆潮,這個(gè)圖不允許出現(xiàn)循環(huán)宏蛉,循環(huán)依賴(lài),Maven就會(huì)報(bào)錯(cuò)性置。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拾并,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹏浅,更是在濱河造成了極大的恐慌嗅义,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隐砸,死亡現(xiàn)場(chǎng)離奇詭異芥喇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)凰萨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)械馆,“玉大人胖眷,你說(shuō)我怎么就攤上這事∨椋” “怎么了珊搀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尾菇。 經(jīng)常有香客問(wèn)我境析,道長(zhǎng)囚枪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任劳淆,我火速辦了婚禮链沼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沛鸵。我一直安慰自己括勺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布曲掰。 她就那樣靜靜地躺著疾捍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栏妖。 梳的紋絲不亂的頭發(fā)上乱豆,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音吊趾,去河邊找鬼宛裕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趾徽,可吹牛的內(nèi)容都是我干的续滋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼孵奶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疲酌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起了袁,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朗恳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后载绿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粥诫,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年崭庸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀浆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怕享,死狀恐怖执赡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情函筋,我是刑警寧澤沙合,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站跌帐,受9級(jí)特大地震影響首懈,放射性物質(zhì)發(fā)生泄漏绊率。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一究履、第九天 我趴在偏房一處隱蔽的房頂上張望滤否。 院中可真熱鬧,春花似錦挎袜、人聲如沸顽聂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紊搪。三九已至,卻和暖如春全景,著一層夾襖步出監(jiān)牢的瞬間耀石,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工爸黄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滞伟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓炕贵,卻偏偏與公主長(zhǎng)得像梆奈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子称开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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