天天看點

Maven項目之間關系介紹

單純的項目A中需要項目B中的資源,将項目B打成Jar包被A依賴,此時項目A直接調用項目B中資源即可。

項目A和項目B此時形成最基本的依賴關系。

需要場景:

如果多個子項目中使用的是相同的依賴或插件,此時我們可以把相同的配置抽取到一個父項目中,進行統一的管理,保持一緻性。是以繼承關系此時顯得比較重要,在java中,繼承展現在代碼功能上,而maven中的繼承則展現在pom.xml,跟功能代碼沒有關系,當項目A繼承了項目B,則項目A擁有了項目B的pom.xml檔案中所有依賴。當然繼承中也不同的用法和不同的場景。

我們在同級目錄建立01_parent、02_child、03_child,一個父項目,兩個子項目

01_parent的pom.xml:

02_child的pom.xml:

03_child的pom.xml:

然後我們看看maven項目之間的關系:

Maven項目之間關系介紹

我們很明顯的看到,兩個子項目都成功的擁有了父項目的依賴。maven的基本繼承關系就弄完了。

但是實際開發中,我們可能有多個功能不同得子項目,父項目中的依賴并不是每一個子項目都必須全部需要的。這個時候如果子項目擁有了父項目全部依賴就有點說不過去了,甚至可能産生jar包沖突。

這裡我們可以使用<code>&lt;dependencyManagement&gt;</code>标簽來解決我們上述的問題,這個标簽的作用其實相當于一個對所依賴 jar 包進行版本管理的管理器.( dependencyManagement 裡隻是聲明依賴,并不實作引入)

這樣一來,父項目就像超市,子項目就像客戶,父項目将部分不是基本的依賴放入其中,子項目需要就聲明即可,不需要的話父項目也不會強人所難。

在01_parent這個“超市”中添加了log4j和commons-logging的兩個依賴供子項目選擇。

此時02_child需要log4j這個依賴:

03_child需要commons-logging這個依賴:

看maven項目之間的依賴:

Maven項目之間關系介紹

此時02_child沒有了commons-logging,03_child沒有了log4j,我們已經解決了這個問題。

如果子項目使用的依賴不是父項目的版本,需要在子項目的pom中标明依賴的版本,否則預設使用的是父項目管理的版本。

其實我們這個問題主要是學習<code>&lt;dependencyManagement&gt;</code>這一标簽在父項目中的作用

此時我們對02_child進行打包會報錯,具體原因是:

Non-resolvable parent POM for org.example:02_child:1.0-SNAPSHOT: Could not find artifact org.example:01_parent:pom:1.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13@

說子項目解析不了父項目的POM檔案,parent.relativePath錯誤。其實,我們在子類的parent标簽中還要加一個<code>&lt;relativePath&gt;</code>标簽,來指明父項目中POM的相對實體路徑,這樣子項目打包的時候,maven才能工具标簽找到父項目的POM位址,不然也不知道子項目的引用從哪來。

項目報錯:

子項目打包出錯:Invalid packaging for parent POM com.cloud:DemoName:1.0-SNAPSHOT, must be “pom“ but is “jar“。

我們必須在父項目中pom指定打包格式為POM:<code>&lt;packaging&gt;pom&lt;/packaging&gt;</code>

Could not find artifact com.cloud:DemoName:pom:1.0-SNAPSHOT

子項目打包前必須先打包父項目

聚合本身沒有實質的内容,随着程式的發展,項目也會越來越大,功能越來越多,開發人員往往會将其劃分子產品進行開發,功能清晰,設計清晰。maven的聚合特性就是将多個子產品聚合在一起建構。并且聚合是建立在繼承關系上,父項目的作用除了統一管理子項目的依賴,還做最後統一建構所有子子產品,實作一次建構多個項目!

此處做個比喻,有一天我們被要求制作一個“強大”的機器,機器人靠着很多零件組裝,團隊有4個人,一個管理者,三個開發人員,管理者将其工具包分成三個局部零件交給我們開發,我們每人一個不同的零件開發子產品,并在管理者下進行開發。我們開發時,如果零件子產品之間沒有互相依賴的關系可以并行開發,如果有單向依賴關系那就得看具體需求了。

當我們開發完成後統一交給管理者對我們的局部零件進行組裝,最後的結果就是管理者(Maven)統一聚合項目下所有子子產品成為最終項目成果。

代碼就不示範了,我使用的是MVC分成4個子產品(pojo,mapper,serivce,controller),單項依賴感覺不能講的很清楚,其實自己對聚合關系也隻是一知半解,了解基本,還沒有進行實質的開發。體會不到聚合關系帶來的便利(才學疏淺),要了解詳情就要去看别的部落格了。

本次是對Maven項目之間三大關系的介紹:

最基本的依賴關系:A依賴B

繼承關系:B和C的公共依賴、部分依賴被A統一管理

聚合關系:B、C功能子產品開發完,被A統一進行聚合成完整的功能或項目。(聚合關系建立在繼承關系上)