前一節我們明白了maven是個什么玩意,這一節就來講講他的一個重要的應用場景,也就是通過maven將一個ssh項目分割為不同的幾個部分獨立開發,很重要,加油
--WZY
?
一、maven父工程與子模塊的拆分與聚合原理
maven子模塊相互依賴, 問題描述:將ssh工程拆分為多個模塊開發
1.1、拆分原理
創建一個maven project(pom),然后在創建三個子模塊(maven moudule),其中三個子模塊,分別為 dao、service、web,也就是將三層的內容分別獨立為一個項目,進一步將耦合性降低,其中如何將他們連接起來了,看下圖。
maven多模塊工程打包部署、 為什么需要創建parent父工程來管理其下三個子模塊呢?并讓其子模塊繼承他呢?
繼承是為了消除重復,如果將dao、service、web分開創建獨立的工程則每個工程的pom.xml文件中的內容存在重復,比如:設置編譯版本、鎖定spring的版本的等,可以將這些重復的配置提取出來在父工程的pom.xml中定義
將三層都獨立分開來了,web層如何調用service層代碼?service層又如何調用dao層的代碼呢?
這個在沒有maven之前是不可以這樣做的,但是有了maven一切都不一樣了,web層調用service層的代碼其實很簡單,因為service是一個完整的項目,那么我們在web層這個項目中想要使用別得項目中的代碼,只需要通過maven的pom.xml文件編寫對應的坐標,將其jar包加入進來即可達到目的,因此,看圖中,ssh-web依賴ssh-service,ssh-service依賴ssh-dao,其中的原理就是我說的這樣,所以才能將這三層分開成獨立的項目,并且進一步抽取其公有依賴的jar包,統一交由父工程來管理,這就maven帶來的效果。
優雅地使用maven父子工程,?
1.2、聚合原理
項目開發通常是分組分模塊開發,每個模塊開發完成要運行整個工程需要將每個模塊聚合在一起運行,比如:dao、service、web三個工程最終會打一個獨立的war運行
二、案例實現
maven父項目引了子項目的包, 問題描述:使用maven將ssh項目進行分模塊,并且實現從web到dao層的數據的存取進行實驗
2.1、創建maven-parent父模塊
點擊next
點擊next
創建好之后的父工程如圖
從它的目錄結構可以看出,父工程本身不寫代碼,它里面有一個pom.xml文件,這個文件可以將多個子模塊中通用的jar所對應的坐標,集中在父工程中配置,將來的子模塊就可以不需要在pom.xml中配置通用jar的坐標le、
?
在父工程的pom.xml中抽取一些重復的配置的,比如:鎖定jar包的版本、設置編譯版本等,一般這種都不需要我們自己臨時配置,網上或者公司都有已經寫好了的,每次使用就直接丟過來即可。下面給一個我收藏的額。嘿嘿
?
?
2.2、創建maven-dao子模塊
點next進入如下圖
點擊next,如下圖
點擊finish,完成,查看父工程中的pom.xml文件
查看ssh_dao中的pom.xml文件,會發現多了一個 parent結點,并且內部所包含的結點,其實就是父工程的坐標
?
查看ssh_dao的目錄結構
因為是在dao層,和數據庫打交道,那么就在這個項目中,需要配置hibernate.hbm.xml和hibernate.cfg.xml,但是又集成了spring,所以hibernate.cfg.xml就不需要了,添加applicationContext.xml即可(這里需要有spring整合hibernate的基礎)
注意:將applicationContext.xml拆分出一個applicationContext-dao.xml,此文件中只配置dao
?
其他幾個Student.java這些就不用看了,太簡單了。
?
StudentTest.java這個需要講解一下,因為這里使用junit測試的時候,會報錯,報的錯誤是找不到junit的jar包,這里我們就會很疑惑,為什么會找不到該jar包呢,不是在父工程里面都導入了junit的jar包了嗎?這里出錯的原因是傳遞依賴的范圍問題。
將父工程看做A項目(下面簡稱A),將該子模塊ssh_dao看做B項目(下面簡稱B),A依賴junit的jar包是直接依賴。B繼承A(實際操作就是B中填寫A的坐標)也可以看成一種依賴,那么就是這樣一種關系,B 依賴 A 依賴 junit, A依賴junit是直接依賴沒錯,那么B跟junit的關系就叫做傳遞(間接)依賴,我們知道A依賴的junit時,junit的jar包可以設置在A中的使用范圍,就是scope屬性,可以為compile,test等,而junit設置的是test,只在A中測試的時候用,那么B想用junit時,junit的作用范圍是不是也是test呢?這就有一種關系。具體看表。
按照剛才上面的例子,來看看在B中,junit的作用范圍是什么?首先看B 依賴 A,直接依賴,并且A在B中的作用范圍是compile(沒設置就默認),所以在直接依賴這一列中找到compile這一行,也就是用紅色框框框起來的一行,然后B 依賴 junit,對A來說,A 是傳遞依賴 junit,這時候看junit設置的作用范圍是多少(也就是看junit在B中的使用范圍是什么)?看傳遞依賴這一行,junit設置的是test,找到test這一列,看相交的地方,是空的,則說明,junti在B中的test范圍不能夠使用,其實看圖,B中任何范圍內都不能夠使用junit,這樣你就理解了這張圖是什么意思。這只是原理,實際上我們解決這種問題的時候,用一個簡單粗暴的解決方案。什么jar包丟失了,我們就再次導入一次jar包即可。
所以在ssh_dao子模塊的pom.xml中有junit的坐標才能使用test
2.3、創建ssh_service子模塊
方法同ssh_dao模塊創建方法一樣,模塊名稱為ssh_service。
看ssh_service和ssh_parent的pom.xml文件,會出現和ssh_dao創建時一樣的情況,ssh_service多出一個parents結點,ssh_parent多個一個module結點
?
在ssh_service的pom.xml中添加兩個依賴
?
然后編寫service層的代碼,
主要關注一下applicationContext-service.xml中的事務的相關代碼
?
該層的測試,需要將ssh_dao中的applicationContext-dao.xml將ssh_service的applicationContext-service.xml包含進去才能夠實驗的通。這里不做測試,
?
?
2.4、創建ssh_web子模塊
方法同maven-dao模塊創建方法,模塊名稱為ssh-web,注意:打包方式為war,而不再是jar包了,因為該層需要放到tomcat中去。與瀏覽器交互,就是web項目了,所以打成war包
和前面一樣,ssh_parent的pom.xml中增加一個module結點,而ssh_web的pom.xml中增加一個parent結點
這個也很簡單,就是跟寫普通的struts2是一樣的,只不過是和spring的結合,有什么對象,都通過spring來給予,并且這里多做一個事情,就是將之前的applicationContext配置文件進行結合,看下圖
?
web.xml中配置struts2的攔截器和spring的監聽器
?
這里注意一個問題,struts跟spring整合的時候,Struts.xml中的class應該填寫spring配置文件中的id。
?
2.5、總結與啟動
父工程和子模塊都寫完之后,就成這樣了
運行調試即可。這里我遇到一個小問題,一直解決不了,
?
三、總結
理解了這個分模塊與聚合的作用,并且知道如何開發即可。加油。確實搞的有點煩躁。
?
?
原文鏈接:https://www.cnblogs.com/whgk/p/7121336.html