聚合的意義:
對(duì)于一個(gè)大型的項(xiàng)目,如果我們直接作為一個(gè)工程開發(fā),由于相互之間的依賴我們只能從頭到尾由一組人開發(fā),否則就會(huì)出現(xiàn)一個(gè)類好多人開發(fā),相互更改的混亂局面,這個(gè)時(shí)候我們就將項(xiàng)目進(jìn)行了橫向和縱向的拆分。
所謂的橫向的拆分就是我們平常說的三層架構(gòu),將項(xiàng)目分成了web層,service層、dao層(web層也被叫做表現(xiàn)層,service層也被叫做業(yè)務(wù)層,dao層也被持久層),可以理解為將一個(gè)功能模塊的不同調(diào)用過程進(jìn)行了水平方向的拆分。
所謂的縱向拆分就是將一個(gè)項(xiàng)目的多個(gè)功能模塊進(jìn)行了,可以理解為為了完成一個(gè)系統(tǒng),深度(縱向)分析需要有哪些功能,然后將這些功能獨(dú)立出來,進(jìn)行了(縱向)拆分。
橫向拆分后,每個(gè)功能模塊進(jìn)行了單獨(dú)的開發(fā)之后,項(xiàng)目整合的時(shí)候就需要有一個(gè)能夠整合這些項(xiàng)目或者模塊的工程,這就是所謂聚合工程的意義。
建立聚合工程需要注意:
1.該聚合項(xiàng)目本身也做為一個(gè)Maven項(xiàng)目,它必須有自己的POM
2.它的打包方式必須為: pom
3.引入了新的元素:modules---module
4.版本:聚合模塊的版本和被聚合模塊版本一致
5.relative path:每個(gè)module的值都是一個(gè)當(dāng)前POM的相對(duì)目錄
6.目錄名稱:為了方便的快速定位內(nèi)容,模塊所處的目錄應(yīng)當(dāng)與其artifactId一致(Maven約定而不是硬性要求),總之,模塊所處的目錄必須和<module>模塊所處的目錄</module>相一致。
7.習(xí)慣約定:為了方便構(gòu)建,通常將聚合模塊放在項(xiàng)目目錄層的最頂層,其它聚合模塊作為子目錄存在。這樣當(dāng)我們打開項(xiàng)目的時(shí)候,第一個(gè)看到的就是聚合模塊的POM
8.聚合模塊減少的內(nèi)容:聚合模塊的內(nèi)容僅僅是一個(gè)pom.xml文件,它不包含src/main/Java、src/test/java等目錄,因?yàn)樗皇怯脕韼椭渌K構(gòu)建的工具,本身并沒有實(shí)質(zhì)的內(nèi)容。
9.聚合模塊和子模塊的目錄:他們可以是父子類,也可以是平行結(jié)構(gòu),當(dāng)然如果使用平行結(jié)構(gòu),那么聚合模塊的POM也需要做出相應(yīng)的更改。
10 如果聚合項(xiàng)目的子模塊新建完成后進(jìn)行了刪除操作,一定要在聚合項(xiàng)目中pom.xml中的modules選項(xiàng)卡中將這個(gè)子模塊進(jìn)行刪除
繼承的意義:
繼承除了能夠避免重復(fù),還有一個(gè)好處就是讓項(xiàng)目更加安全
繼承時(shí)需要注意;
1.說到繼承肯定是一個(gè)父子結(jié)構(gòu),那么我們?cè)诰酆享?xiàng)目中來創(chuàng)建一個(gè)parent project
2.<packaging>: 作為父模塊的POM,其打包類型也必須為POM
3.結(jié)構(gòu):父模塊只是為了幫助我們消除重復(fù),所以它也不需要src/main/java、src/test/java等目錄
4.新的元素:<parent> , 它是被用在子模塊中的
5.<parent>元素的屬性:<relativePath>: 表示父模塊POM的相對(duì)路徑,在構(gòu)建的時(shí)候,Maven會(huì)先根據(jù)relativePath檢查父POM,如果找不到,再從本地倉庫查找
6.relativePath的默認(rèn)值: ../pom.xml
7.子模塊省略groupId和version: 使用了繼承的子模塊中可以不聲明groupId和version, 子模塊將隱式的繼承父模塊的這兩個(gè)元素
總結(jié):
對(duì)于聚合模塊來說,它知道有哪些被聚合的模塊,而對(duì)于被聚合的模塊來說,它們不知道被誰聚合了,也不知道它的存在
對(duì)于繼承關(guān)系的父POM來說,它不知道自己被哪些子模塊繼承了,對(duì)于子POM來說,它必須知道自己的父POM是誰
在一些最佳實(shí)踐中我們會(huì)發(fā)現(xiàn):一個(gè)POM既是聚合POM,又是父POM,這么做主要是為了方便。