爲了防止傳遞依賴,我們各個模塊之間儘量用直接依賴的方式。本篇文章介紹多模塊化開發,我們做過Maven項目的都知道,我們的項目一般都是分模塊的,每個模塊都會對應着一個POM.xml文件,它們之間通過繼承和聚合(也稱多模塊,multi-module)相互關聯。
我們換另一種思路想想,那麼我們能不能一個項目就用一個模塊。這樣開起來很方便,簡單明瞭,那麼做起來呢,接下來我們分析一下。
假設我們有這麼一個項目,整個項目構建一個war包,而每一層放到各自的Package裏面。如下:
Itoo-Exam
com.tgb.itoo.exam.dao -----負責與數據庫的交互,封裝了Hibernate的交互類
com.tgb.itoo.exam.service----負責處理業務邏輯,放Service接口及其實現類
com.tgb.itoo.exam.web-------負責與客戶端的交互,主要放action/controller,jsp等等
com.tgb.itoo.exam.util--------工具類
那麼隨着我們項目的擴大,Maven項目也會越來越大,那麼會遇到下面的幾個問題:
1、首先build整個項目的時間越來越長,儘管你一直在web層工作,但你不得不build整個項目
2、模塊化體現不出來,如果我們只負責維護某個模塊,因爲我們所有的模塊都在一個war包中,那麼我們可以隨意修改其他模塊(權限的控制),導致版本管理混亂,衝突。同時因爲模塊太多,太大,不好維護。
很多人都在同時修改這個war包,將導致工作無法順利進行。
3、pom.xml本來是可以繼承、複用的,但是如果我們新建一個項目,只能依賴於這個war包,那麼會把這個war包的相關的前臺的東西依賴過來,導致項目管理混亂。
這樣的管理是混亂的,沒有遵守一個設計模式原則:“高內聚,低耦合”。相反在代碼內部,所有的東西都耦合在了一起。因此我們需要劃分模塊。
另外,隨着技術的飛速發展和各類用戶對軟件的要求越來越高,軟件本身變得越來越複雜,設計人員開始採用各種方式進行開發,於是就有了我們的分層架構、分層模塊來提高代碼的清晰和重用。從而實現了系統內部的高內聚、低耦合。
實際上我們項目的包結構:
Itoo-root (pom.xml pom包)
Itoo-base-parent(pom.xml pom包)
Itoo-base(pom.xmljar包)
Itoo-tool(pom.xmljar包)
Itoo-exam-parent (pom.xml pom包)
Itoo-exam-api (pom.xml jar包)
Itoo-exam-student-core (pom.xml jar包)
Itoo-exam-student-web (pom.xml war包)
Itoo-exam-student-ear (pom.xml ear包)
如上關係圖,pom包的全是父項目,用來管理子項目的jar包。parent裏面聚合了很多子項目。
模塊的依賴關係:
Itoo-base--->itoo-tool
Itoo-exam-api-->itoo-base
Itoo-exam-student-core--->itoo-exam-api
Itoo-exam-student-web--->itoo-exam-api
模塊化的好處
1、方便重用,當我們再開發一條teacher線的時候,我們只需要引用itoo-base,itoo-exam-api,這些包都是複用的,稱爲我們平臺複用的基礎類庫,供所有的項目使用。這是模塊化最重要的一個目的。
2、劃分了模塊,包之間的依賴關係非常清晰,包的版本管理也非常清晰,不用再到一個混亂的pom中修改自己的配置了。
3、靈活性。比如我們這些公共的jar包,itoo-base,itoo-tool,itoo-exam-api等這些jar包,我們不需要再當源碼,只需要deploy到nexus,其他人從nexus下載即可。代碼的可維護性、可擴展性好,並且保證了項目獨立性與完整性。
4、build項目的時候,只需要build自己所需要的項目,不僅節省時間而且結構清晰。
5、上篇文章寫得DependencyManagement與dependencies,父項目中管理jar包版本。使得整個項目的測試版本與發佈版本一致。
使用模塊化配置,複用性強,防止pom變得過於龐大,方便構建;針對項目的管理更方便,每一個模塊都是獨立的,抽象出一個父類來管理第三方jar的版本,開發人員只需要開發自己的線,其他的都不用管,靈活;基於此種基礎我們還可以做分佈式。
上面提到了我們用父項目聚合子項目,子項目繼承父項目。下篇博客我們繼續介紹Maven模塊的聚合和繼承。