2014-02-10 86 views
10

那麼這是一個有趣的經歷,自從我構建了我的maven多模塊項目幾個星期以來。Maven多模塊項目結構化問題

當我決定使用maven進行我的構建生命週期管理時,我有幾個原因希望選擇maven。

a。大多數開發團隊是分開的,以便每個團隊可以在項目中的單獨模塊中工作,如Team-A在用戶管理系統上工作,Team-B在授權系統上工作,Team-C在文檔管理系統上工作......並且等等。每個團隊都有java開發人員,測試人員,UI專家等。

因此,maven項目結構應該是這樣的,每個團隊都可以獨立地在各自的模塊上工作。他們必須能夠編寫,編譯,構建,測試和部署他們的模塊,而無需編譯,測試屬於其他團隊的模塊。

就這樣我來到結論maven的多模塊項目的每個開發模塊必須代表一個功能模塊

PROJECT STRUCTURE 1

有些論壇上的討論,我發現人們建議我按照分層的方法後,子模塊必須是控制層,服務層,道層等層。我沒有注意這個建議,因爲這不能解決我在單個模塊上工作的團隊的目的。通過這種方式,大型項目在開發期間每個團隊的構建和部署時間會增加,這會影響項目時間表。有時候,如果項目中有10到11個模塊,構建和部署時間最多可達30分鐘。

但我確實留意建議每個模塊保持DAO層分離不是一個好主意,因爲DAO是高度顆粒狀的並被其他模塊重用。所以一個模塊對其他模塊的依賴會變得更大。

我通過創建一個通用模塊並將DAO和DOMAIN移動到通用模塊來發現此問題的解決方案,該模塊將作爲每個模塊的依賴項繼承。這似乎是一個更可行的選擇。現在項目結構看起來像這樣。

PROJECT STRUCTURE 2

現在,當我生成項目,並運行在服務器上web應用程序,它抱怨404,未找到資源。我發現這是因爲缺少WEB-INF/classes文件夾,在web-app模塊中缺少src/main/java。我搜索並找到了幾條鏈接,提示它是Eclipse中的部署組裝問題。所以我需要手動創建這些文件夾並添加到部署程序集中,因爲maven不會這樣做。

但更大的問題是

  1. 我是否需要將控制器類,如com.mycompany.usermgmtsys.controller.UserMgmtController等爲src /主/ Java或行家應該發現從控制器模塊jar包含在WEB-INF/lib中作爲依賴項。

我不想這樣做,即將java文件放入web-app。我希望所有控制器都可以作爲Web-app的依賴項,例如WEB-INF/lib/usermgmtsystem.jar。但是,那麼Tomcat就不會在類文件夾中尋找控制器。

我不知道該怎麼辦?任何建議,將不勝感激。

+0

你想要你的控制器/服務取決於你的網絡應用程序?這是倒退。您的Web應用程序是您的客戶端層,應該位於架構「堆棧」的頂部。它應該調用服務層,然後將請求編排到其他服務和/或域層。 – tdrury

+0

在我的問題中的任何地方,我並不是要顛倒依賴順序。我期望的所有內容都是讓網絡應用程序從其打包在戰爭中的依賴性瓶子中識別其控制器,以便不存在404。如果您查看結構,我仍然具有正確的依賴順序,即Common(包裝DAO和DOMAIN )作爲UserManagement的依賴項,它充當Web-app的依賴。問題是因爲我在各個子模塊中包含了各自的控制器,它們在WEB-INF/classes文件夾中找不到,而在WEB-INF/lib中找不到它們作爲jar。 – RaghaveShukla

+0

由於它們是依賴jar,它們應該在WEB-INF/lib中。這是正確的行爲。 – tdrury

回答

0

我想出了這個問題。控制器是表示層組件。調度員期望目標中WEB-INF/classes文件夾中的表示層組件,而不是在lib中查找它。我不確定這是否僅適用於eclipse中基於maven的構造。所以最後這些是我所做的改變

a。在web-app中創建一個src/main/java源文件夾。它不是在web-app模塊中默認生成的。 b。在src/main/java文件夾中添加軟件包和相應的控制器。

所以,我有最終的結構(我沒有確切的粘貼日食快照,這是整體圖)

Final Structure

0

這是一個很好的問題。有用的項目佈局必須考慮許多方面。我想嘗試回答一個你沒有提到的問題。用戶可以擴展您的應用嗎?如果是,則考慮爲公共API層(服務接口,這些服務使用的DTO以及服務拋出的異常)創建單獨的模塊。

在我們的應用程序中,我們爲每個功能區域提供了幾個Maven模塊。這個想法是,一個小組在一個功能區域內開展了一項功能研究,並且這種隔離使得他們與另一個小組正在修改的來源相混淆。在我們稱之爲「api」,「domain」和「service」的maven子模塊中,每個功能區域都進一步細分 - 我們不會將服務/控制器,域和異常集中到一個模塊中。 api模塊包含我們想要向客戶公開自定義的類。我們的服務層是這些接口的實現。此外,我們不允許一個模塊的服務調用另一個模塊的服務,因爲這會繞過我們的服務編排層,客戶可以將擴展附加到我們的服務。爲每個功能區域使用單獨的Maven模塊有助於執行此操作。

我們有其他模塊(內部API,網絡,適配器),但他們並不真正加入到這個話題。

+0

我不知道我是否按照預期理解了您的回覆。但是,即使我像你一樣做着相同的事情,除非你將模塊劃分得更高一些。在我的實際應用程序中,父模塊具有子項(mediamanager-webapp,用戶管理,授權管理,文檔管理,績效管理,報告管理,通知管理)。所以這些按功能區域劃分。但似乎您已將模塊進一步細分爲每個模塊的子模塊「域」和服務。你的公共API與我的通用模塊相同。 – RaghaveShukla

+0

這是一個很好的方法,我通過最初的進一步細分。但是,然後我認爲它是一個矯枉過正,因爲每個進一步的細分還有一個額外的maven配置,彈簧配置來維護。其次,即使我們不鼓勵一個服務調用另一個服務直到必要,這就是爲什麼通用模塊提供所有模塊的DAO層以便粒度DAO層可以被重新使用。理想情況下,如果您繪製具有演示文稿 - >服務 - >數據訪問的3層體系結構,則會看到該域不屬於任何一個層,而是屬於一個公共層。 – RaghaveShukla

+1

爲了方便管理這麼多模塊,我們使用「模板」POM和POM繼承。所有「api」模塊都繼承自api模板POM,該模板使用來設置我們所有api模塊的插件配置。我們有服務,網絡服務,域名等模板。 – tdrury

1

它的日蝕使基於Maven項目的方式。它通常創建兩個結構。一個基於master pom(父項目),另一個基於單個模塊pom。然而在任何結構上做出改變都會反映在另一個結構中。作爲一種做法,我在單個模塊文件夾結構中進行更改,並且更容易閱讀。

我個人儘量避免多模塊項目,如果你使用Maven的發佈插件,你被鎖定到所有的模塊釋放在一起。

雖然這可能聽起來像一個方便,但是當您需要對其中一個模塊進行錯誤修復發佈時,您會遇到問題 - 您最終將發佈所有模塊,而不僅僅是具有錯誤修復的模塊,儘管增加了它們的版本他們沒有改變。

還,如果你正在運行多模塊項目CI採取一擊 - 你打造通常運行在所有模塊從你的根POM,但如果你是一個特定的模塊在工作,你最終取構建那些沒有改變的實體,實際上失去了模塊化提供的一些好處。

所以,去與獨立的模塊,但,這是最重要的一點,創建各自所採用的共同「依賴」 POM。

'依賴'pom是一個pom,標準化項目中的所有依賴關係,不同之處在於這些依賴關係在dependencyManagement部分而不是依賴關係部分中指定(它也設置標準插件配置等)。這允許您的項目poms指定依賴項pom作爲它們的父項,然後聲明它們所需的依賴項減去從「依賴性」pom中選擇的版本,從而在您的項目中進行標準化。

如果您仍然擔心能夠構建所有內容,可以通過一個簡單的批處理文件來實現。