Maven項目多個模塊(modules)聚合


1、一個簡單的Maven模塊結構是這樣的:

 ---- app-parent

             |-- pom.xml (pom)

             |

             |-- app-util

             |        |-- pom.xml (jar)

             |

             |-- app-dao

             |        |-- pom.xml (jar)

             |

             |-- app-service

             |        |-- pom.xml (jar)

             |

             |-- app-web

                      |-- pom.xml (war)   

這樣做的好處是:

  1. 方便重用,如果你有一個新的swing項目需要用到app-dao和app-service,添加對它們的依賴即可,你不再需要去依賴一個WAR。而有些模塊,如app-util,完全可以漸漸進化成公司的一份基礎工具類庫,供所有項目使用。這是模塊化最重要的一個目的。
  2. 由於你現在划分了模塊,每個模塊的配置都在各自的pom.xml里,不用再到一個混亂的紛繁復雜的總的POM中尋找自己的配置。
  3. 如果你只是在app-dao上工作,你不再需要build整個項目,只要在app-dao目錄運行mvn命令進行build即可,這樣可以節省時間,尤其是當項目越來越復雜,build越來越耗時后。
  4. 某些模塊,如app-util被所有人依賴,但你不想給所有人修改,現在你完全可以從這個項目結構出來,做成另外一個項目,svn只給特定的人訪問,但仍提供jar給別人使用。

 

2、父子pom的詳細配置

父Pom配置:

<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.cainiao.test</groupId>
  <artifactId>parent</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>project-1</module>
    <module>project-2</module>
  </modules>
</project>

Maven的坐標GAV(groupId, artifactId, version)在這里進行配置,這些都是必須的。特殊的地方在於,這里的packaging為pom。所有帶有子模塊的項目的packaging都為pom。packaging如果不進行配置,它的默認值是jar,代表Maven會將項目打成一個jar包。在Maven build parent的時候,它會根據子模塊的相互依賴關系整理一個build順序,然后依次build。

父pom的作用是抽取各個子模塊公用的依賴,控制其版本號,從而保持各個子模塊依賴版本一致。

子模塊pom配置:

<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.cainiao.test</groupId>
    <artifactId>parent</artifactId>
    <version>1.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

<artifactId>project-1</artifactId>
  ....

</project>
 

它沒有聲明完整GAV(groupId, artifactId, version),這里我們只看到了artifactId。這個POM並沒有錯,groupId和version默認從父模塊繼承了。實際上子模塊從父模塊繼承一切東西,包括依賴,插件配置等等。

 3、模塊之間的引用

當 app-web引用了模塊app-service,那么在運營app-web時,maven會自動根據依賴關系,先將app-service進行編譯,然后對app-web進行編譯,編譯過程中的依賴都是本地整個項目工程的源碼,無需上傳app-service到maven倉庫。

 

參考文章:

https://blog.csdn.net/f45056231p/article/details/84942531

https://xinklabi.iteye.com/blog/2075345

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM