2010-05-21 68 views
3

隨着我的Maven項目的發展,我試圖留在項目結構之上。到目前爲止,我有一個2-3級的嵌套目錄佈局,每個級別都有一個POM,其中module條目對應於該級別的目錄。 POM繼承(parent屬性)不一定遵循這一點,並且與此問題的目的不相關。在Maven項目中,嵌套或平面目錄佈局的原因是什麼?

現在,雖然嵌套結構對Maven來說看起來很自然,只要你在一個特定的層次上,它就很好,乾淨,我開始對我在IDE中看到的東西感到困惑(Eclipse和IntelliJ理念)。

我看了一下Apache Felix的源代碼,他們有一個非常複雜的項目,好像是一個扁平的目錄結構,所以我想知道這是否會是更好的方法。

你在實踐中經歷過的任何一種方法有哪些優點和缺點?

注意this question(我發現同時)似乎非常相似。我會把它留給社區來決定這是否應該作爲一個副本來關閉。

回答

1

我使用了一種混合的方法。具有不同生命週期的事物(從版本和VCS的角度來看)是平坦的,具有相同生命週期的事物是嵌套的。我使用svn:externals進行結帳。我在this previous answer中寫過這種方法。

+0

其他答案真的很好,謝謝。 – 2010-05-22 14:26:59

1

我投了築巢。我使用的IDEA 9顯示了項目窗格中的嵌套,因此演示文稿反映了您的邏輯項目結構。 (這不是8.1的情況 - 它已經變平了。)

我更喜歡保持東西嵌套,特別是如果名稱非常相似 - 使用命令提示符時導航更容易。我有一個像myapp-layer-component這樣的名稱的項目,所以它們都以相同的前綴開頭,而且很多都具有相同的層,因此在命令行中使用自動完成是無用的。將這些分離爲嵌套結構會更容易,因爲名稱(應用程序名,層或組件)的每個部分在目錄結構中的每個級別只重複一次。

如果從命令行構建,構建項目的子集比如構建項目更容易,如果我正在研究數據庫模型,那麼我經常需要構建該領域的所有項目。當文件變平時,這是非常棘手的 - 我知道的唯一方法是使用maven的-pl參數並指定要構建的項目。使用嵌套目錄,我只需cddb目錄並運行mvn

例如,而不是

myapp-web-gui1 
myapp-web-gui2 
myapp-web-base 
myapp-svc-clustered 
myapp-svc-clustered-integrationtest 
myapp-svc-simple 
myapp-db-model 
myapp-db-hibernate 

我們有結構

\myapp 
    \web 
    \gui1 
     pom.xml 
    \gui2 
     pom.xml (other poms omitted to keep it short) 
    \base 
    \svc 
     \clustered 
     \clustered-it 
     \simple 
    \db 
     \model 
     \hibernate  

你也可以添加嵌套集成測試,但是這似乎是驅動點太遠。

築巢,您還可以繼承的所有優點(和它的一些痛苦......)

我已經受夠了這個唯一的問題是,目錄名稱不匹配的神器ID 。 (我還在使用完整的artifactIds。)所以每個項目都必須顯式定義SCM路徑,因爲這些路徑不能再從父pom中推斷出來。當然,每個目錄都可以與artifactId相同,然後可以從父項中推斷出SCM的詳細信息,但是我發現長目錄名稱有點笨拙。

+0

你如何處理可能經常被編碼在目錄樹中的多種語義, G。 Subversion中的分支/標籤? – 2010-05-21 14:28:07

+0

你能舉出另一個例子嗎,我很無聊,我不太明白你在問什麼。 – mdma 2010-05-21 14:34:41

+0

在一個大型項目中有幾個層次結構,例如什麼屬於VCS,哪些屬於一起構建,什麼屬於一個部署(zip等),開發人員需要在IDE中爲特定任務等這些往往重疊*主要是*,但往往*不太*。隨着你重用模塊越多,這就越是嚴重,這是首先模塊化的重要原因。 – 2010-05-21 15:23:18