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)
這樣做的好處是:
- 方便重用,如果你有一個新的swing項目需要用到app-dao和app-service,添加對它們的依賴即可,你不再需要去依賴一個WAR。而有些模塊,如app-util,完全可以漸漸進化成公司的一份基礎工具類庫,供所有項目使用。這是模塊化最重要的一個目的。
- 由於你現在划分了模塊,每個模塊的配置都在各自的pom.xml里,不用再到一個混亂的紛繁復雜的總的POM中尋找自己的配置。
- 如果你只是在app-dao上工作,你不再需要build整個項目,只要在app-dao目錄運行mvn命令進行build即可,這樣可以節省時間,尤其是當項目越來越復雜,build越來越耗時后。
- 某些模塊,如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
