Maven - 繼承和聚合
*聚合(多模塊)
在一個(gè)項(xiàng)目中 往往有多個(gè)模塊組成 例如有項(xiàng)目demo 下面有a, b兩個(gè)模塊
為了能使用一條命令就能構(gòu)建demo-a, demo-b兩個(gè)模塊, 需要?jiǎng)?chuàng)建一個(gè)額外的聚合模塊, 然后通過(guò)該模塊構(gòu)建整個(gè)項(xiàng)目的所有模塊。
聚合模塊(demo-parent) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <packaging>pom</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-parent Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
- </project>
模塊a(demo-a) pom:
- <project xmlns="<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"
- xsi:schemaLocation="<a href="http://maven.apache.org/POM/4.0.0">http://maven.apache.org/POM/4.0.0</a> <a href="http://maven.apache.org/maven-v4_0_0.xsd">http://maven.apache.org/maven-v4_0_0.xsd</a>">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-a</artifactId>
- <packaging>jar</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-a Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <finalName>demo-a</finalName>
- </build>
- </project>
模塊b(demo-b) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-b</artifactId>
- <packaging>jar</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-b Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <finalName>demo-b</finalName>
- </build>
- </project>
額外模塊(demo-parent) pom中的modules節(jié)點(diǎn)有多個(gè)module,每個(gè)module的值都是一個(gè)被聚合模塊的相對(duì)目錄。
關(guān)于聚合模塊目錄與其他模塊的目錄主要有兩種形式:
a.父子關(guān)系:
父子關(guān)系 聚合模塊的pom:
- <modules>
- <module>demo-a</module>
- <module>demo-b</module>
- </modules>
a.平行目錄:
平行目錄 聚合模塊的pom:
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
最后在聚合模塊(demo-parent)的pom上面 運(yùn)行mvn命令 根據(jù)聚合順序依次構(gòu)建多個(gè)模塊。
*繼承
上面的例子中, a,b兩個(gè)模塊都依賴junit, 為了消除重復(fù),可以使用pom的繼承,以達(dá)到一處聲明,多處使用的目的。
聚合模塊(demo-parent) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <packaging>pom</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-parent Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
- </project>
模塊a(demo-a) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-a</artifactId>
- <name>demo-a Maven Webapp</name>
- <build>
- <finalName>demo-a</finalName>
- </build>
- </project>
模塊b(demo-b) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-b</artifactId>
- <name>demo-a Maven Webapp</name>
- <build>
- <finalName>demo-b</finalName>
- </build>
- </project>
parent元素聲明父模塊,parent下的子節(jié)點(diǎn)groupId,artifactId,version指定父模塊的坐標(biāo),這三個(gè)元素是必須的。
節(jié)點(diǎn)relativePath指定父模塊pom的路徑,默認(rèn)值是:../pom.xml,也就是說(shuō)父pom在上一層目錄,(<relativePath>../demo-parent/pom.xml</relativePath> 表示父模塊pom和子模塊是平行目錄)
可以被繼承的POM元素:
groupId:項(xiàng)目id,項(xiàng)目坐標(biāo)的核心元素
version:項(xiàng)目版本,項(xiàng)目坐標(biāo)的核心元素
description:項(xiàng)目描述信息
organization:項(xiàng)目組織信息
inceptionYear:項(xiàng)目創(chuàng)世年月
developers:項(xiàng)目開(kāi)發(fā)者信息
contributors:項(xiàng)目貢獻(xiàn)者信息
distributionManagement:項(xiàng)目部署配置
scm:項(xiàng)目的版本控制信息
mailingLists:項(xiàng)目郵件列表信息
properties:自定義的屬性
dependencies:項(xiàng)目的依賴配置
dependencyManagement:項(xiàng)目的依賴管理配置
repositories:項(xiàng)目的倉(cāng)庫(kù)配置
build:項(xiàng)目源碼目錄配置。輸出目錄配置,插件配置等。
*依賴管理
父模塊(demo-parent) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <packaging>pom</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>demo-parent Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <!-- dependencyManagement 定義的依賴 需要在子pom中聲明 不然不會(huì)產(chǎn)生效果 -->
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <modules>
- <module>../demo-a</module>
- <module>../demo-b</module>
- </modules>
- </project>
模塊a(demo-a) 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 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-a</artifactId>
- <name>demo-a Maven Webapp</name>
- <properties>
- <mail.version>1.4.1</mail.version>
- </properties>
- <dependencies>
- <!-- 聲明父pom中的依賴 這樣才會(huì)真正被使用 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <!-- 擴(kuò)展依賴 父pom中并沒(méi)有聲明 不會(huì)影響到父POM 和其他模塊 -->
- <dependency>
- <groupId>javax.mail</groupId>
- <artifactId>mail</artifactId>
- <version>${mail.version}</version>
- </dependency>
- </dependencies>
- <build>
- <finalName>demo-a</finalName>
- </build>
- </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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.x.demo</groupId>
- <artifactId>demo-parent</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <relativePath>../demo-parent/pom.xml</relativePath>
- </parent>
- <artifactId>demo-b</artifactId>
- <name>demo-a Maven Webapp</name>
- <!-- 沒(méi)有聲明父pom中的依賴 不會(huì)被使用 -->
- <build>
- <finalName>demo-b</finalName>
- </build>
- </project>
父POM 中使用dependencyManagement 聲明的依賴不會(huì)給子模塊引入依賴, 只會(huì)繼承這段配置。
在模塊a(demo-a) pom中聲明了父pom中junit依賴 在執(zhí)行的時(shí)候才會(huì)獲得真正的依賴信息。
模塊b(demo-b) pom中沒(méi)有聲明父pom中junit依賴 不會(huì)產(chǎn)生實(shí)際效果。
posted on 2014-04-01 15:20 順其自然EVO 閱讀(594) 評(píng)論(0) 編輯 收藏 所屬分類: 持續(xù)集成 、maven