簡體   English   中英

Maven 多模塊項目組合關於依賴共享

[英]Maven multimodule project composition regarding dependencies sharing

有幾個類似的問題,但沒有這樣的。 您如何處理這種情況(典型場景):

一個由 8-11 個子項目組成的項目,有一個父工件/項目和一個主要使用/聲明其他項目作為模塊的主項目。

問題是所有項目“嚴格”只共享公共依賴項,如testng, logging, apache commons and stuff 但總是像其中 3 個使用 50-60% 的相同特定依賴項(apache-chemistry、jackrabbit、abdera 等),另外 2-3 個也使用 50-60% 相同但不同的依賴項。 主要的使用了很多相同的部門。

我不能將那些“非嚴格”共享的部門放入父項目中以供其他人繼承。 所以只有共同的部門被繼承。 並且有大量重復的依賴項。 而且我只能通過<dependencyManagement>管理他們的版本。

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

我可以有超過 1 個父項目,但感覺不對。 此外,來自父項目的 inheritance 可能是一場噩夢,因為如果您沒有正確記錄/注釋父 pom 定義,您不知道項目需要哪些依賴項。

另一種方法是創建僅用作依賴容器的 pom 工件——它們聲明特定的依賴組,因此模塊只需聲明這些依賴即可獲得傳遞依賴。 但是,嘿,你想部署並提交某種

OneDepArtifact 聲明jackrabit, abdera, chemistry

AnotherDepArtifact 聲明htmlcleaner, google-api, tika

ThirdDepArtifact 聲明spring, httpclient, selenium

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

我正在考慮使我的應用程序開發適應“maven 多模塊設計”。 但是如果你想創建 spring 服務/bean,只使用各種庫,在一個模塊中,你不要在不同的模塊中實現它們,只是因為它們使用其他模塊也使用的庫:-)

Maven 3.1 應該通過引入“mixins”來解決這個問題。 與此同時,我似乎可以通過正確使用配置文件來獲得大部分所需的功能,正如我在這篇博文中所描述的:

http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles

請讓我知道您是否覺得它有用。

我知道你說這可能是一場噩夢,但我強烈認為你的父母 pom 之間的 inheritance 是通往 go 的方式。

我在這個答案中描述了一個好的多模塊項目結構。 它還描述了使用聚合器和父鏈 inheritance。

一些可以幫助您保持井井有條和理智的事情...

  • 使用良好的命名約定; 不要只調用父項目parent1parent2 使用描述他們配置的依賴類型和其他內容的名稱,以便人們直觀地知道何時使用哪個。
  • 使用 maven 的發布/部署功能,以便在您的存儲庫中正確地對它們進行版本控制,並始終引用固定版本的工件。 不使用 SNAPSHOT 是獲得確定性、可重復構建的第一步。 當事情發生變化時調試問題是非常困難的。
  • 不要依賴 pom.xml 文件來了解您的項目需要哪些依賴項。 這將導致您避免使用 inheritance 和其他諸如自定義配置文件之類的東西。 您應該使用maven-dependency-plugin來執行這些分析任務。 有像mvn dependency:tree這樣的命令,它顯示了一個項目的所有依賴項和mvn dependency:analyze ,它顯示了未使用的依賴項。

希望有了這個建議,父 POM 文件 inheritance 不會顯得那么復雜和噩夢。 祝你好運!

如果它主要是關於版本(數字)控制 - 為什么不在父項目中僅將依賴版本指定為屬性並在子項目中使用它,例如

家長

<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>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM