[英]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。
一些可以幫助您保持井井有條和理智的事情...
parent1
和parent2
。 使用描述他們配置的依賴類型和其他內容的名稱,以便人們直觀地知道何時使用哪個。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.