2010-11-11 64 views
8

我們公司已經定義了一些關於Maven poms的「最佳實踐」。例如,指定utf-8用於資源處理,要執行過濾的文件夾,處理單元測試與集成測試以及編譯器設置。跨不相關項目共享Maven pom.xml部分的最佳方式?

眼下,這些最佳做法記錄在我們公司的wiki,但在「最佳做法」的變化列表,這些變化很少體現在項目的勁歌,直到出現了問題。人性是它是什麼,所有......

有什麼辦法可以通過Maven提供/執行這些設置和屬性?這幾乎就像給每個項目一個父pom.xml,但我不想(也不能)讓所有這些項目引用同一個父pom。

我們需要一種能夠在開發人員的機器上以及我們的Hudson CI服務器上工作的方法。

+2

我在其他字體閱讀 「porn.xml」。 ☺ – tchrist 2010-11-11 14:51:38

回答

6

唯一的maven解決方案是一個共同的家長。也許如果你使用'發佈'的父母,你可以做到這一點?

製作一個只包含父pom的項目,然後運行發佈插件,將其發佈到您的內部存儲庫。然後使用該父項作爲所有項目的父項,讓它們從您的倉庫中下載它,而不是通過相對路徑名找到它?

+0

如果我理解正確,那我是不是必須更改所有現有項目的目錄結構?另外,我認爲這可能會嚴重破壞我們的發佈流程。但是這個建議的確給了我至少在源代碼控制下保留部分pom.xml的想法.... – HDave 2010-11-11 15:03:08

+1

AT ALL沒有改變目錄。父級不必具有文件系統樹關係。它可能只是從存儲庫中獲取的工件。 – bmargulies 2010-11-11 15:46:18

+0

我做了你的建議,它的工作很棒。非常感謝。除了目錄mental-block之外,我還有(長期的)誤解,任何引用父pom的pom.xml都必須作爲該父pom中的模塊命名 - 也就是說,父母和孩子必須是雙向的,定向聯想。 – HDave 2010-11-11 21:08:50

2

如果沒有主人,你就沒有技術方法去執行你所要求的(並且每個項目也不會很好地處理它)。 隨着時間的推移,保持最佳實踐的唯一有效方法是通過使其成爲執行強制的人的工作。你可以將它傳播給許多人(例如,把它添加到他們的工作描述中),但這往往會讓它被遺忘,因爲每個人都會認爲別人正在這樣做。一個人通過名字來識別,並且不會有任何推passing。

3

這幾乎就像給每個項目一個父pom.xml,但我不想(也不能)讓所有這些項目引用同一個父pom。

我不是說要一定把一切都放在一個父POM,但在企業環境中,這真是一個好主意,有一個頂級企業POM(如在Maven書的部分3.6.2.2. Multi-module Enterprise Project所示) ,擁有自己的發佈週期。

但這將不足以執行任何東西,我的建議是看它提供existing rules但也允許使用maven-enforcer-rule-api編寫自己的自定義規則的Maven Enforcer Plugin。儘管如此,我還是不能評論你可以用自定義規則走多遠。無論如何,我強烈推薦這個插件。如果你還沒有使用它,那肯定是開始的時候:)

+0

會做...謝謝。 – HDave 2010-11-11 21:09:41

4

你可以用滿足你公司最佳實踐的設置來構建maven項目原型。這是'提供'而不是'強制'解決方案,可能還不夠(取決於這些最佳實踐的真實含義)。 http://maven.apache.org/guides/mini/guide-creating-archetypes.html

+0

這是一個好主意,原型實際上可以引用我的新標準化父pom併爲maven-release-plugin正確設置SCM URL。 – HDave 2010-11-12 14:47:18

4

(這是一個古老的線程,我只是添加此信息僅供參考)

依賴關係,你可以使用「dependencyManagement」進口集團(但它會只依賴,而不是性質的工作,等等)。

只是有一個「庫」POM像往常一樣定義各種依賴關係(及其排除和特定版本)。

然後在項目的主要部分中,將該依賴項部分導入到「dependencyManagement」部分:將導入在庫pom中定義的每個依賴項。此外,在這個dependencyManagement中定義的每個版本都將是總是由Maven使用(Maven將不會採用另一個版本,而不是依賴於dependencyManagement中定義的版本)。如果你有不同的項目依賴於相同的庫集,這對於管理你的類路徑幾乎是必須的。

在您的主項目的POM,導入庫POM這樣的:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.mycompany.mylibrary</groupId> 
      <artifactId>mylibrary-artifact</artifactId> 
      <version>mylibrary-version</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
     ... 

檢查online maven documentation

相關問題