Maven入門-5.Maven的聚合和繼承

一、Maven的聚合

在Maven入門-4.Maven的依賴中,咱們建立了2個以上的模塊,每一個模塊都是一個獨立的maven project,在開始的時候咱們能夠獨立的編譯和測試運行每一個模塊,可是隨着項目的不斷變大和複雜化,模塊會愈來愈多,就不能每個都編譯測試了,這時Maven給出了聚合的配置方式。
所謂聚合,顧名思義,就是把多個模塊或項目聚合到一塊兒
如今新建一個專門負責聚合工做的Maven project(user-aggregator)
新建好以後的項目是以下狀態:

這時咱們能夠把裏面的全部內容都刪掉,只保留pom.xml便可。
java

1.1 聚合的配置

在pom.xml中使用modules來聚合其它模塊。
user-aggregator的pom.xml文件內容以下:mysql

 
 
 
 
 
<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>com.fz.user</groupId> <artifactId>user-aggregator</artifactId> <version>0.0.1-SNAPSHOT</version> <!--這裏的打包方式須要爲pom--> <packaging>pom</packaging> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>

聚合完成後就可使用clean test 等命令來統一編譯聚合進來的幾個模塊了,它的好處就是在一個項目中把其餘項目都一次編譯了。。git

二、Maven的繼承

在剛纔的項目中,有不少重複的配置,有相同的groupId和version,有相同的log4j、juit等等的依賴,Maven中能夠聲明一個父POM供子POM繼承。
能夠把父pom理解爲Java中的一個父類,而後pom.xml中的一些groupId,version,相同的依賴之類的均可以理解味Java父類的一些共有屬性。子POM繼承了該父POM,就繼承了這些屬性(groupId,version,相同的依賴)sql

2.1 可被繼承的POM元素

 
 
 
 
 
groupId:項目組ID,項目座標的核心元素version: 項目版本, 項目座標的核心元素description: 項目的描述信息organization: 項目的組織信息inceptionYear: 項目的創始年份url: 項目的URL地址developers: 項目開發者信息contributors: 項目的貢獻者信息distributionManagement: 項目的部署配置issueManagement: 項目的缺陷跟蹤系統信息ciManagement: 項目的持續集成系統信息scm: 項目的[版本控制](http://lib.csdn.net/base/git "Git知識庫")系統信息mailingLists: 項目的郵件列表信息properties: 自定義的maven屬性dependencies: 項目的依賴配置dependencyManagement: 項目的依賴管理配置repositories: 項目的倉庫配置build: 包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等reporting: 包括項目的報告輸出目錄配置、報告插件配置等

下面開始
新建一個父POM項目(user-parent),用於管理子POM中重複的」屬性」。一樣也是刪除掉src/java/main等無用的目錄。只留下pom.xml便可。
也能夠把聚合的配置也放到該繼承pom.xml文件中
新建好的結構以下:

user-parent中的pom.xml文件內容以下:apache

 
 
 
 
 
<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>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!--這裏的打包方式須要爲pom--> <packaging>pom</packaging> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>

2.2 POM中使用繼承

user-core模塊的pom.xml文件最初始內容以下maven

 
 
 
 
 
<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>com.fz.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>user-core</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> </dependency> </dependencies></project>

這裏咱們能夠把如下內容添加到user-parent的pom.xml中,讓子POM來繼承。測試

 
 
 
 
 
<groupId>com.fz.user</groupId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>

修改user-parent模塊中的pom.xml,內容以下:ui

 
 
 
 
 
<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>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--properties中能夠自定義屬性--> <junit.version>4.10</junit.version> <log4j.version>1.2.17</log4j.version> <hamcrest.version>1.3</hamcrest.version> </properties> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>

而後在user-core模塊中使用parent元素來實現繼承,修改後的pom.xml以下:url

 
 
 
 
 
<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元素來實現繼承 --> <parent> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 這裏要加上relativePath來指定user-parent的pom.xml文件的絕對路徑 --> <relativePath>../user-parent/pom.xml</relativePath> </parent> <artifactId>user-core</artifactId> <name>user-core</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!--這裏使用自定義屬性 --> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <!--這裏使用自定義屬性 --> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <!--這裏使用自定義屬性 --> <version>${hamcrest.version}</version> </dependency> </dependencies></project>

2.3 繼承dependency

除了普通屬性能夠被繼承,dependency也能夠被繼承下來。咱們把user-core中的dependency放到user-parent中。
dependency的繼承須要用dependencyManagement來管理。若是不使用dependencyManagement,每個子POM都會把父POM中的dependency繼承下來。也就是說,每一個子模塊中都會有所有的jar包,這確定是不行的
下面能夠把user-core,user-log,user-dao,user-service幾個模塊中的全部dependency都加到user-parent中,而後在各個子POM中使用該dependency便可。
修改後的user-parent的pom.xml文件內容以下:spa

 
 
 
 
 
<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>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--properties中能夠自定義屬性--> <junit.version>4.10</junit.version> <log4j.version>1.2.17</log4j.version> <hamcrest.version>1.3</hamcrest.version> </properties> <!-- 繼承中須要使用dependencyManagement來管理依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!--這裏使用自定義屬性--> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <!--這裏使用自定義屬性--> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <!--這裏使用自定義屬性--> <version>${hamcrest.version}</version> </dependency> <dependency> <groupId>com.fz.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.fz.user</groupId> <artifactId>user-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.fz.user</groupId> <artifactId>user-log</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>

而後在user-core,user-log,user-dao,user-service幾個模塊中繼承這些依賴。這裏以user-core爲例,user-core的pom.xml文件內容以下:

 
 
 
 
 
<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元素來實現繼承 --> <parent> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 這裏要加上relativePath來指定user-parent的pom.xml文件的絕對路徑 --> <relativePath>../user-parent/pom.xml</relativePath> </parent> <artifactId>user-core</artifactId> <name>user-core</name> <!-- 子POM繼承父POM的dependency時須要什麼依賴就添加什麼依賴就好了 可是要去掉version。只保留groupId和artifactId便可 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </dependency> </dependencies></project>

這樣一來,每一個模塊中就只會引用到本身定義的dependency中的依賴了。
例子:
如今想加入mysql的jar包,可是這個jar包只會在user-dao中使用,其餘模塊中不會用到。能夠在user-parent和user-dao中分別增長一條dependency

而後查看user-dao模塊中的jar包
上圖中,user-log和user-core中沒有mysql的依賴,因爲user-service依賴了user-dao,因此也一樣會有mysql-connector-java的依賴。

相關文章
相關標籤/搜索