2011-06-14 153 views
5

有幾個類似的問題,但沒有像這樣。如何處理這種情況(典型場景):有關依賴關係共享的Maven多模塊項目組合

8-11個子項目的項目,有一個父項目/項目和一個主要項目,主要使用/將這些項目聲明爲模塊。

問題是,所有項目「嚴格」只共享共同的依賴項,如testng, logging, apache commons and stuff。但總是像其中3人使用50-60%的相同特定折扣(apache-chemistry,jackrabbit,abdera等),另外2-3人也使用50-60%的相同但不同的依賴關係。主要的使用了許多相同的代價。

我不能將這些「非嚴格」共享deps放入父項目中以供其他人繼承它們。所以只有共同的代價才被繼承。並且有大量重複的依賴關係。我只能通過<dependencyManagement>管理他們的版本。

另一種選擇是父pom包含大部分依賴關係,但子項目甚至會繼承那些他們不需要的項目。

我可以有超過1個父項目,但它感覺不對。父項目的繼承也可能是噩夢,因爲如果你沒有正確地記錄/評論父項目定義,你不知道項目需要什麼依賴項。

另一種方法是創建僅用作依賴容器的pom構件 - 它們聲明特定的依賴關係組,以便模塊聲明這些構件以獲得傳遞性依賴關係。但是,嘿,你想部署,並承諾某種

OneDepArtifact聲明jackrabit, abdera, chemistry

AnotherDepArtifact聲明htmlcleaner, google-api, tika

ThirdDepArtifact聲明spring, httpclient, selenium

這是一個巨大的混亂,我不知道如果我正確使用<dependencyManagement>,它似乎只對管理依賴項版本有用。

我在考慮將我的應用程序開發調整爲「maven multimodule design」。但是如果你想創建彈簧服務/ bean,只使用不同的庫,在一個模塊中,你不會在不同的模塊中實現它們,只是因爲它們使用庫,其他模塊也使用:-)

+0

我有完全相同的問題。我喜歡管理多模塊項目,因爲它帶來了其他優勢,但如果項目變大,這種跨模塊依賴關係共享是一場噩夢。 – lisak 2011-06-14 18:15:04

+0

也許人們必須調整實際的應用程序開發到多模塊項目設計,並嘗試創建這樣的組件,以便不會有任何依賴重用......但這似乎並不正確 – lisak 2011-06-14 18:31:54

回答

0

如果它的主要講述的版本(數量)控制 - 爲什麼不在父項目僅指定的依賴版本屬性,並使用它在兒童項目,如

家長

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>foo.bar</groupId> 
    <artifactId>maven-parent</artifactId> 
    <version>0.0.1</version> 
    <packaging>pom</packaging> 

    <properties> 
     <log4j.version>1.2.16</log4j.version> 
    </properties> 

</project> 

兒童

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <artifactId>maven-parent</artifactId> 
     <groupId>foo.bar</groupId> 
     <version>0.0.1</version> 
    </parent> 

    <groupId>foo.bar</groupId> 
    <artifactId>maven-child</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
    </dependencies> 

</project> 

這是一個簡單的解決方案,可讓您使用一致的版本號指定特定的項目依賴關係。

+0

這不是關於版本控制,這只是的好處......我沒有版本問題,不像其他人......我在問題中提到過,這只是我控制的東西...我把屬性和dependencyManagement結合起來,基於什麼是繼承和什麼不是 – lisak 2011-06-14 19:59:42

+0

問題是所有這些poms中依賴關係的數量和重複,即使你的版本在控制之下,它仍然很難保持在一個大的項目 – lisak 2011-06-14 20:03:57

1

我知道你說這可能是一場噩夢,但我強烈地感覺到你父母之間的遺傳就是要走的路。

我在this answer中描述了一個很好的多模塊項目結構。它還描述了使用聚合器和父鏈式繼承。

一些東西,這將幫助你使事情變得有組織,有理智...

  • 使用良好的命名約定;不要致電父母項目parent1parent2。使用名稱來描述他們配置什麼樣的依賴關係和其他東西,因此人們很直觀地知道在什麼時候使用。
  • 使用maven的發佈/部署功能,以便它們在您的回購中正確版本化並始終引用固定版本工件。不使用SNAPSHOT是確定性,可重複構建的第一步。在事情變化時調試問題非常困難。
  • 不要依賴pom.xml文件來知道項目需要什麼依賴關係。這將導致您避免繼承和其他事情,如自定義配置文件。您應該使用maven-dependency-plugin來執行這些分析任務。有像mvn dependency:tree這樣的命令向您顯示項目的所有依賴關係,並顯示您未使用的依賴關係的mvn dependency:analyze

希望通過這個建議,父POM文件繼承看起來不會那麼複雜和噩夢。祝你好運!

+0

我只在同一級別有一個父目錄/ pom(繼承SuperPom並聚合所有10個模塊)和模塊目錄/ pom。模塊繼承自父類,它們是它的模塊。不過,我已經按照你的建議去做了。我相信我必須接受它。我不希望鏈接繼承與3個子父母......我真的希望所有的模塊聲明所有這些重複的依賴關係在多模塊項目 – lisak 2011-06-14 22:15:55

+0

@lisak - 你爲什麼喜歡重新聲明所有的重複依賴關係,而不是使用繼承?此外,你應該嘗試讓你的父母不同於聚合器的POM。根據我的經驗,這總能讓事情變得更輕鬆。我在鏈接到的答案中描述了這種佈局。 – 2011-06-15 14:49:15

+0

如果共享依賴是構成模塊兄弟的唯一方面,那麼鏈式繼承就是多餘的。如果還有一些插件或構建階段的東西要繼承,爲什麼不呢。但除此之外,我發現它更容易處理。另外,很難跟蹤在依賴關係中列出的Unused聲明的運行時/測試依賴項:analyze ...只是我不在乎我是否使用它,也許這是主要問題,在這種情況下,此功能的存在並沒有給我帶來任何救濟:-) – lisak 2011-06-15 16:27:08